SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 19.04.2011 22:53:56

jerry
Участник
Зарегистрирован: 31.01.2011
Сообщений: 18

Подскажите, пожалуйста, с ORDER BY при JOIN-ах

В движке есть много подобных запросов

SELECT *
FROM product p
LEFT JOIN product_to_category p2c ON ( p.product_id = p2c.product_id )
WHERE p2c.category_id = '1'

индекс на product_id (product)
составной индекс на category_id и product_id (product_to_category)

(то есть в запросе всегда присутствует таблица product, к которой по ключу product_id подсоединяется что-то ещё (категория, производитель, разного рода специальные списки) и отсекает всё лишнее)

Вывод продуктов со всех этих запросов нужно сортировать по product_id. Если например в данном запросе делать сортировку по p.roduct_id, то запрос будет выполняться очень долго.
SELECT *
FROM product p
LEFT JOIN product_to_category p2c ON ( p.product_id = p2c.product_id )
WHERE p2c.category_id = '1'
ORDER BY p.product_id

Делая сортировку по p2c.product_id запрос отрабатывается также быстро, как и вобще без использования сортировки, так как таблица p2c (product_to_category) обрабатывается первой(судя по explain).



Вопрос собственно в том, как целесообразней поступить ? - проверять каждый запрос (смотреть explain) и исходя из того, какая таблица обрабатывается первой подбирать поле (как в вышеприведённом случае. тормозит ORDER BY p.product_id, посмотрели explain и выбрали ORDER BY p2c.product_id). Но встаёт вопрос  - не может ли из-за изменений объёма данных, кореляции индексов и пр. факторов со временем mysql начнёт обрабатывать таблицы в другом порядке (раньше первой была product_to_category, таблицы например сильно изменились в объёме и mysql решил ставить первой product)  (также и из-за версий mysql, в 5.0 одно, в 5.1 может всё будет по другому)    - может ли быть что-то подобное, или же как бы объём данных не изменялся порядок соединений таблиц будет всегда одинаков ?

Если всё же изменение порядка соединения таблиц возможно, то стоит ли дополнительно задавать точный порядок обработки таблиц с помощью STRAIGHT_JOIN ?
SELECT *
FROM product_to_category p2c
STRAIGHT_JOIN product p ON ( p.product_id = p2c.product_id )
WHERE p2c.category_id = '1'
ORDER BY p2c.product_id


и вобще может быть есть ещё какие-нибудь способы отсортировать по product_id ?

Отредактированно jerry (20.04.2011 00:18:56)

Неактивен

 

#2 20.04.2011 21:43:46

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Подскажите, пожалуйста, с ORDER BY при JOIN-ах

Порядок выборки таблиц определяется, разумеется, также и распределением данных
по таблицам, поэтому он может поменяться. Если нужен конкретный порядок — лучше
зафиксировать его через STRAIGHT_JOIN. Только не переборщите — часто оказыва-
ется, что план оптимизатора лучше, чем то, что придумывает человек smile

Неактивен

 

#3 20.04.2011 22:32:19

jerry
Участник
Зарегистрирован: 31.01.2011
Сообщений: 18

Re: Подскажите, пожалуйста, с ORDER BY при JOIN-ах

Спасибо

Неактивен

 

#4 20.04.2011 23:25:33

jerry
Участник
Зарегистрирован: 31.01.2011
Сообщений: 18

Re: Подскажите, пожалуйста, с ORDER BY при JOIN-ах

подскажите ещё один момент, пожалуйста

в запросах с несколькими JOIN-ами

SELECT *
FROM product_to_category p2c
STRAIGHT_JOIN product p ON ( p.product_id = p2c.product_id )
LEFT JOIN product_description pd ON ( p.product_id = pd.product_id )
WHERE p2c.category_id = '1'
AND pd.language_id='1'
ORDER BY p2c.product_id

что определяет STRAIGHT_JOIN
1. Что таблица product_to_category обрабатывается первой
2. Что таблица product_to_category обрабатывается первой, таблица product обрабатывается второй
3. Что таблица product обрабатывается второй

Я к тому, что стоит ли в запросах везде заменять LEFT JOIN на STRAIGHT_JOIN для гарантии того, что первая таблица запроса (в данном случае product_to_category) будет обрабатываться первой? Просто если STRAIGHT_JOIN определяет 3-й вариант (таблица product обрабатывается второй), то необходимо везде ставить STRAIGHT_JOIN

Отредактированно jerry (20.04.2011 23:27:51)

Неактивен

 

#5 20.04.2011 23:37:26

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Подскажите, пожалуйста, с ORDER BY при JOIN-ах

Кажется, Вы как-то не так пишете STRAIGHT JOIN. Он пишется до списка
таблиц, и тогда он влияет полностью на порядок их выбора:

SELECT STRAIGHT_JOIN blabla FROM tbl1 JOIN tbl2 JOIN tbl3
http://dev.mysql.com/doc/refman/5.1/en/select.html

Неактивен

 

Board footer

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