Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Оптимизация запросов


Автор: xe0ps 1.6.2007, 23:42
1. если мне необходимо обновить несколько записей в одной таблице (данные для каждой записи будут разными), это можно сделать только отдельными запросами или можно их как-то объеденить в один запрос?
2. можно ли обновлять записи в разных таблицах одним запросом как это делаеться в select?
3. насколько резонно вообще объединение запросов? насколько велика разница в нагрузке от одного сложного запроса и нескольких простых? когда не стоит создавать слишком сложные запросы?

заранее благодарен за помощь.

Автор: muzer 2.6.2007, 15:25
1. Почитайте про INSERT ... ON DUPLICATE KEY UPDATE.
Плюсы по сравнению с REPLACE (которым тоже можно решить задачу): не нужно знать значения остальных полей, не фрагментирует индекс.
Минусы: в различных версиях различные баги с этим запросом (в основном, в разборе синтаксиса), работает чуть медленнее REPLACE'а, но это чаще всего компенсируется нефрагментированностью индекса.

2. Можно. UPDATE table1 INNER JOIN table2 ON table1.field1 = table2.field2 SET ... WHERE ...
Нестабильно работает по времени выполнения, лучше предварительно как следует протестировать и погонять разные варианты аналогичным запросом EXPLAIN SELECT ...

3. Вставку записей лучше объединять. UPDATE одной таблицы имеет смысл преобразовывать в INSERT ON DUPLICATE KEY UPDATE, если меняете большое кол-во записей и новые значения полей не вычисляемы из других полей. UPDATE нескольких таблиц объединять можно, но осторожно (см. п.2). Вообще по опыту работы с 4.1 - часто (хотя, конечно, зависит от конкретного примера) лучше работать с отдельными таблицами, в 5.0 ситуация теоретически улучшилась, использование нескольких индексов одновременно, разные типы индексов и т.д., но опытных данных пока мало.

Автор: Dmitry7 4.6.2007, 07:10
цикл
инициация запроса
UPDATE name_tab1 SET fil1="" fil=2 ..
UPDATE name_tab2 SET fil1="" fil=2 ..
...
завершение

либо через хранимую процедуру на сервере СУБД..
Подробнее об этом http://www.da7.ru/otherpage/otp69.shtml

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)