Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> оптомизация написания условий в SELECT, оптимальная структура части WHERE 
V
    Опции темы
_Y_
Дата 28.6.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: нет
Всего: 34



Вопрос, видимо, весьма детский: в какой последовательности проверяются условия WHERE при выполнении SELECT и можно ли на это как-то повлиять с целью оптимизации? 

Например:
Код

SELECT Table1.df1 FROM Table1, Table2, Table3 
WHERE Table1.key1 = Table2.key1 AND Table2.key3 = Table2.key2 AND Table2.df2 = 'YES'  ;

Если таблица Табле2 короче, чем Табле3, а Табле1 - самая длинная, очевидно, что эффективнее всего сначала отработать условие Table2.df2 = 'YES' потом Table2.key3 = Table2.key2 и только потом Table1.key1 = Table2.key1.






--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Glip
Дата 28.6.2007, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: 3
Всего: 18



посмотреть про explain
http://dev.mysql.com/doc/refman/5.0/en/explain.html


--------------------
user posted image
PM MAIL   Вверх
sTa1kEr
Дата 28.6.2007, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 7
Всего: 146



_Y_, почитайте про WHERE Clause Optimization. Обратите внимание, на это
Цитата

 All constant tables are read first before any other tables in the query. A constant table is any of the following:

    *

      An empty table or a table with one row.
    *

      A table that is used with a WHERE clause on a PRIMARY KEY or a UNIQUE index, where all index parts are compared to constant expressions and are defined as NOT NULL.

All of the following tables are used as constant tables:

SELECT * FROM t WHERE primary_key=1;
SELECT * FROM t1,t2
  WHERE t1.primary_key=1 AND t2.primary_key=t1.id;

Т.е. MySQL в любом случае первым будет читать первой Table2, т.к "Table2.df2 = 'YES'", но не потому, что она самая короткая, а потому, что используется для отбора значений только константа. Т.ч. как не переставляй условия, MySQL все равно все переделает так, как ей кажется эффективнее smile

Это сообщение отредактировал(а) sTa1kEr - 28.6.2007, 20:09
PM MAIL   Вверх
muzer
Дата 28.6.2007, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 31.8.2006

Репутация: 30
Всего: 31



sTa1kEr, очень уж вы однозначно утверждаете про функциональность продукта, который не вы разрабатывали smile Порой про свои-то программы не всегда можно с уверенностью говорить, если они разрабатываются годами..
Почитайте про STRAIGHT_JOIN, эта опция заставляет mysql брать таблицы в порядке их перечисления.
НО: мне очень не часто встречаются случаи, когда приходится исправлять работу оптимизатора подобными опциями, чаще всего он выбирает действительно оптимальный вариант.

Добавлено через 2 минуты и 38 секунд
Для тех, кто плохо владеет навыками поисков в документации, уточню - STRAIGHT_JOIN можно написать после SELECT перед перечислением полей. То есть написано про него в разделе "SELECT syntax".
PM WWW   Вверх
sTa1kEr
Дата 29.6.2007, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 7
Всего: 146



Цитата(muzer @  28.6.2007,  21:27 Найти цитируемый пост)
sTa1kEr, очень уж вы однозначно утверждаете про функциональность продукта, который не вы разрабатывали  Порой про свои-то программы не всегда можно с уверенностью говорить, если они разрабатываются годами..

Вы совершенно правы. Иногда даже приходится копаться в исходниках, что бы узнать наверняка как реализован тот или иной функционал. Но все же, как показывает практика, для таких проектов как MySQL или PHP на оригинальную документацию + комментарии пользователей (причем в последнее зачастую полезнее) можно положится.
Цитата(muzer @  28.6.2007,  21:27 Найти цитируемый пост)
Почитайте про STRAIGHT_JOIN, эта опция заставляет mysql брать таблицы в порядке их перечисления.

Спасибо за информацию, хотя я с трудом представляю когда это может пригодится. Можете привести пример?
PM MAIL   Вверх
_Y_
Дата 29.6.2007, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: нет
Всего: 34



Спасибо, вроде стало почти понятно. Не знал я ни про  STRAIGHT_JOIN, ни про такое использование EXPLAIN и, соответственно, доки не смотрел. 

Но если мой пример упростить:
Код

SELECT Table1.df1 FROM Table1, Table2, Table3 
    WHERE Table1.key1 = Table2.key1 AND Table2.key2 = Table3.key2;

При этом предположить, что таблицы не индексированы и структура у них очень похожая. При этом сам-то я знаю, что условие Table2.key2 = Table3.key2 даст гораздо меньше результатов, чем Table1.key1 = Table2.key1. Не для таких ли случаев существует STRAIGHT_JOIN?

И еще - что-то у меня сомнение возникло при чтении документации. Ибо сказано:
Цитата
To force the optimizer to use a join order corresponding to the order in which the tables are named in the SELECT  statement, begin the statement with SELECT STRAIGHT_JOIN

Правильно ли я подоздеваю, что подозревается перечисление таблиц после слова FROM, а не внутри структуры WHERE?


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
muzer
Дата 29.6.2007, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 31.8.2006

Репутация: 30
Всего: 31



Цитата(_Y_ @  29.6.2007,  11:23 Найти цитируемый пост)
Правильно ли я подозреваю, что подразумевается перечисление таблиц после слова FROM, а не внутри структуры WHERE?

Правильно. Только это одно и то же smile Он же не может выполнять where от первой таблицы, во время чтения второй (имеется ввиду where, относящийся к полям одной таблицы, а не связывающий, который по-хорошему надо писать в секции JOIN).
PM WWW   Вверх
_Y_
Дата 29.6.2007, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: нет
Всего: 34



Спасибо. Теперь вроде все понятно smile 


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0491 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.