MySQL: порядок пунктов - PullRequest
4 голосов
/ 15 мая 2011

Влияет ли порядок предложений MySQL на эффективность? например

SELECT * 
  FROM TABLE AS t
 WHERE t.Employee_id = 1
   AND t.payout > 500

VS.

SELECT * 
  FROM TABLE AS t
 WHERE t.payout > 500
   AND t.Employee_id = 1

Кроме того, что если t.Employee_id проиндексирован, а t.payout нет?

Ответы [ 3 ]

1 голос
/ 15 мая 2011

Влияет ли порядок предложений MySQL на эффективность?

номер

Наиболее близким будет порядок столбцов в покрывающем индексе (более одного столбца для одного индекса) на основе столбцов, идущих слева направо в объявлении индекса. Неважно, где столбцы используются в запросе, настолько сильно, что самые левые столбцы в покрывающем индексе присутствуют в запросе для запуска использования.

что если t.Employee_id проиндексирован, а t.payout нет?

Оптимизатор может принять решение об использовании индекса - его наличие не гарантирует его использования. Таблица статистики также влияет на решение использовать индекс или нет.

Но порядок столбцов в предложении WHERE не определяет, используется ли индекс.

1 голос
/ 15 мая 2011

Порядок всего в sql может быть переупорядочен планировщиком запросов так, как он считает нужным, если арифметика позволяет это.Это включает в себя AND, OR, внутренние объединения, некоторые случаи внешних объединений и т. Д. Он также может реорганизовывать операторы IN, отменять вложенные запросы и т. Д.

Так что да, он найдет ваш правильный индекс и т. Д.

Остерегайтесь, чтобы это не взорвалось и на вашем лице.Например, это утверждение:

 select y <> 0 and (x / y) > 0;

никогда не будет создавать проблемы, скажем, в C, но в SQL планировщик полностью свободен, чтобы сначала оценить правую часть и подавить деление на ноль ошибок.

Если вы хотите форсировать порядок, вам нужно использовать оператор case:

 select case when y <> 0 then (x / y) > 0 else false end;

Последнее примечание: для массивных запросов, полных объединений и подзапросов, планировщики обычно сталкиваются с пороговыми значениями, после которых онибольше не пытайтесь каждый возможный план, и достигните достаточно хорошего запроса, используя генетические алгоритмы.Когда они это делают, порядок соединения и т. Д. Имеет значение.

0 голосов
/ 15 мая 2011
  1. Настройте запросы на EXPLAIN, чтобы убедиться в этом.Всегда лучший вариант
  2. Неважно, оптимизатор MySQL проверит его для вас и даст вам лучший результат, который он может придумать.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...