SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.02.2009 08:46:58

freeneutron
Участник
Зарегистрирован: 09.02.2009
Сообщений: 2

Всегда ли стоит доверять оптимизатору?

Всегда ли стоит доверять оптимизатору, или возможны случаи, когда выгоднее отсоединить от запроса одну таблицу и свести задачу к серии запросов?
Например:

Код:

$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']}");

Если, конечно такое случается, то хотелось бы определить критерий, по которому можно определить ситуацию, когда следует прибегать к разбиению единого запроса...

Неактивен

 

#2 09.02.2009 10:46:26

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Всегда ли стоит доверять оптимизатору?

В такой ситуации разбивать запрос имеет смысл только рассматривая блокировки. Долгий SELECT блокирует все INSERT до завершения своего выполнения. Много маленьких SELECT приводят к  снижению времени ожидания, но как правило общее время исполнения от этого увеличивается. Чаще всего разбиение на кусочки практикуется для операций UPDATE и DELETE, чтобы они не работали слишком долго, блокируя селекты.

См статья про блокировки в MySQL

Неактивен

 

#3 09.02.2009 11:54:14

Magz
Гуру
Откуда: Москва
Зарегистрирован: 18.09.2007
Сообщений: 112

Re: Всегда ли стоит доверять оптимизатору?

Мне кажется, надо еще смотреть на EXPLAIN объединенного запроса и общее количество возвращаемых данных. Если в результате выборки из трех больших (более 1000 записей) таблиц возвращается 5 строк, то 5 "маленьких" запросов будут, скорее всего, быстрее, чем один "большой". Также, 5 "маленьких" создадут меньшую нагрузку на сервер, чем один "большой", если "маленькие" будут использовать индексы, а в "большом" появится tempory table и filesort.
Вообще, оптимизировать нужно то, что нужно. Если данный запрос "так, как есть" работает на приемлимом для конкретной задаче уровне, то лучше его оставить в покое smile

Неактивен

 

#4 09.02.2009 17:22:01

freeneutron
Участник
Зарегистрирован: 09.02.2009
Сообщений: 2

Re: Всегда ли стоит доверять оптимизатору?

Magz написал:

Если в результате выборки из трех больших (более 1000 записей) таблиц возвращается 5 строк, то 5 "маленьких" запросов будут, скорее всего, быстрее, чем один "большой".

Мне тоже так кажется, но терзают смутные сомнения (ведь при правильной оптимизации дельфину проще будет занырнуть и вынырнуть один раз и за один раз отискать нужные данные). Придется наверно поставить парочку экспириментов.

Неактивен

 

#5 10.02.2009 17:15:45

EugeneTM
Гуру
Зарегистрирован: 11.04.2008
Сообщений: 89

Re: Всегда ли стоит доверять оптимизатору?

Разбивать наверное стоит поосторожнее.

Про коннект тоже не забывайте.
На быстрых запросах очень немало отъедает.

И пять запросов вместо одного по трем предельно мелким таблицам по 1000 записей без вариантов сольют одному.

Хоть я особо на слово MySQL AG не верю, но даже на инсерте
http://dev.mysql.com/doc/refman/5.1/en/ … speed.html
разбиение в топку.

Как вариант - завернуть все запросы в ХП, один раз отправить параметры - один раз получить ответ.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson