![]() |
|
Модераторы: skyboy |
![]()
|
|
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: нет Всего: 34 |
Вопрос, видимо, весьма детский: в какой последовательности проверяются условия WHERE при выполнении SELECT и можно ли на это как-то повлиять с целью оптимизации?
Например:
Если таблица Табле2 короче, чем Табле3, а Табле1 - самая длинная, очевидно, что эффективнее всего сначала отработать условие Table2.df2 = 'YES' потом Table2.key3 = Table2.key2 и только потом Table1.key1 = Table2.key1. -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
| Glip |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 473 Регистрация: 30.12.2006 Репутация: 3 Всего: 18 |
||||
|
||||
| sTa1kEr |
|
|||
|
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 7 Всего: 146 |
_Y_, почитайте про WHERE Clause Optimization. Обратите внимание, на это
Т.е. MySQL в любом случае первым будет читать первой Table2, т.к "Table2.df2 = 'YES'", но не потому, что она самая короткая, а потому, что используется для отбора значений только константа. Т.ч. как не переставляй условия, MySQL все равно все переделает так, как ей кажется эффективнее Это сообщение отредактировал(а) sTa1kEr - 28.6.2007, 20:09 |
|||
|
||||
| muzer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 387 Регистрация: 31.8.2006 Репутация: 30 Всего: 31 |
sTa1kEr, очень уж вы однозначно утверждаете про функциональность продукта, который не вы разрабатывали
Почитайте про STRAIGHT_JOIN, эта опция заставляет mysql брать таблицы в порядке их перечисления. НО: мне очень не часто встречаются случаи, когда приходится исправлять работу оптимизатора подобными опциями, чаще всего он выбирает действительно оптимальный вариант. Добавлено через 2 минуты и 38 секунд Для тех, кто плохо владеет навыками поисков в документации, уточню - STRAIGHT_JOIN можно написать после SELECT перед перечислением полей. То есть написано про него в разделе "SELECT syntax". |
|||
|
||||
| sTa1kEr |
|
|||
|
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 7 Всего: 146 |
Вы совершенно правы. Иногда даже приходится копаться в исходниках, что бы узнать наверняка как реализован тот или иной функционал. Но все же, как показывает практика, для таких проектов как MySQL или PHP на оригинальную документацию + комментарии пользователей (причем в последнее зачастую полезнее) можно положится.
Спасибо за информацию, хотя я с трудом представляю когда это может пригодится. Можете привести пример? |
|||
|
||||
| _Y_ |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: нет Всего: 34 |
Спасибо, вроде стало почти понятно. Не знал я ни про STRAIGHT_JOIN, ни про такое использование EXPLAIN и, соответственно, доки не смотрел.
Но если мой пример упростить:
При этом предположить, что таблицы не индексированы и структура у них очень похожая. При этом сам-то я знаю, что условие Table2.key2 = Table3.key2 даст гораздо меньше результатов, чем Table1.key1 = Table2.key1. Не для таких ли случаев существует STRAIGHT_JOIN? И еще - что-то у меня сомнение возникло при чтении документации. Ибо сказано:
Правильно ли я подоздеваю, что подозревается перечисление таблиц после слова FROM, а не внутри структуры WHERE? -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
||||
|
|||||
| muzer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 387 Регистрация: 31.8.2006 Репутация: 30 Всего: 31 |
Правильно. Только это одно и то же |
|||
|
||||
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: нет Всего: 34 |
Спасибо. Теперь вроде все понятно
-------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |