Задавайте вопросы, мы ответим
Вы не зашли.
Всегда ли стоит доверять оптимизатору, или возможны случаи, когда выгоднее отсоединить от запроса одну таблицу и свести задачу к серии запросов?
Например:
$rez = $sql -> query("SELECT t1.num FROM t1, t2, t3 where t1.id = t2.t1_id and t2.id = t3.t2_id and t3.val = 1");
Если t3 ну слишком большая, то возможно выгоднее сделать так:
$temp = $sql -> query("SELECT * FROM t3 where t3.val = 1"); foreach($temp as $t3) $rez[] = $sql -> query("SELECT t1.num FROM t1, t2 where t1.id = t2.t1_id and t2.id = {$t3['id']}");
Если, конечно такое случается, то хотелось бы определить критерий, по которому можно определить ситуацию, когда следует прибегать к разбиению единого запроса...
Неактивен
В такой ситуации разбивать запрос имеет смысл только рассматривая блокировки. Долгий SELECT блокирует все INSERT до завершения своего выполнения. Много маленьких SELECT приводят к снижению времени ожидания, но как правило общее время исполнения от этого увеличивается. Чаще всего разбиение на кусочки практикуется для операций UPDATE и DELETE, чтобы они не работали слишком долго, блокируя селекты.
См статья про блокировки в MySQL
Неактивен
Мне кажется, надо еще смотреть на EXPLAIN объединенного запроса и общее количество возвращаемых данных. Если в результате выборки из трех больших (более 1000 записей) таблиц возвращается 5 строк, то 5 "маленьких" запросов будут, скорее всего, быстрее, чем один "большой". Также, 5 "маленьких" создадут меньшую нагрузку на сервер, чем один "большой", если "маленькие" будут использовать индексы, а в "большом" появится tempory table и filesort.
Вообще, оптимизировать нужно то, что нужно. Если данный запрос "так, как есть" работает на приемлимом для конкретной задаче уровне, то лучше его оставить в покое
Неактивен
Magz написал:
Если в результате выборки из трех больших (более 1000 записей) таблиц возвращается 5 строк, то 5 "маленьких" запросов будут, скорее всего, быстрее, чем один "большой".
Мне тоже так кажется, но терзают смутные сомнения (ведь при правильной оптимизации дельфину проще будет занырнуть и вынырнуть один раз и за один раз отискать нужные данные). Придется наверно поставить парочку экспириментов.
Неактивен
Разбивать наверное стоит поосторожнее.
Про коннект тоже не забывайте.
На быстрых запросах очень немало отъедает.
И пять запросов вместо одного по трем предельно мелким таблицам по 1000 записей без вариантов сольют одному.
Хоть я особо на слово MySQL AG не верю, но даже на инсерте
http://dev.mysql.com/doc/refman/5.1/en/ … speed.html
разбиение в топку.
Как вариант - завернуть все запросы в ХП, один раз отправить параметры - один раз получить ответ.
Неактивен