Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
В движке есть много подобных запросов
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)
Неактивен
Порядок выборки таблиц определяется, разумеется, также и распределением данных
по таблицам, поэтому он может поменяться. Если нужен конкретный порядок — лучше
зафиксировать его через STRAIGHT_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)
Неактивен
Кажется, Вы как-то не так пишете STRAIGHT JOIN. Он пишется до списка
таблиц, и тогда он влияет полностью на порядок их выбора:
SELECT STRAIGHT_JOIN blabla FROM tbl1 JOIN tbl2 JOIN tbl3
http://dev.mysql.com/doc/refman/5.1/en/select.html
Неактивен
Страниц: 1