Как заставить JOIN в MySQL нормально использовать индексы и максимально ускорить выполнение запросов
Несколько раз натыкался на эту проблему, но только сегодня полноценно ее решил. Проблема проста: есть запрос с несколькими JOIN'ами. При выполнении запроса толком не используются индексы. В результате все ужасно тормозит.
Запрос примерно такой:
-
SELECT `a`.*, `b`.*
-
FROM `a` LEFT JOIN `b` ON `a`.`field1` = `b`.`field2`
-
WHERE `b`.`field3` = "something"
-
ORDER BY `a`.`field4`
Понятно, что все может быть сложнее, но для примера сойдет.
Итак, что же надо сделать, чтобы запрос работал максимально быстро (при условии, что запрос и таблицы построены грамотно)?
- Создать индекс по каждому из полей, используемых в
WHEREиJOIN. Отдельно по каждому. - Убедиться, что в WHERE указано максимально жесткое условие дабы сократить диапазон выборки.
- А теперь - внимание! Убедиться, что у
`a`.`field1`и`b`.`field2`одинаковый collation!
Комментарий по последнему пункту: В моем случае у одного поля был latin1_swedish_ci, у второго - utf8_general_ci. Вроде как по данным выходило правильно. Но запрос работал очень медленно, порядка 3 секунд (использовались три таблицы с большим количеством записей - ~100,000, ~30,000 и ~3,000). После применения пункта номер один и особенно пункта номер три запрос стал выполняться за 0.1 (одну десятую!) секунды.


July 30th, 2008 at 16:58 Quote
0.1 это не одна сотая, это одна десятая секунды
сравнение полей с разным collation делать нельзя, MySql выдаст ошыбку, не далее как сегодня утром с этим столкнулся
July 30th, 2008 at 17:33 Quote
venil @ 30.07.2008, 16:58 #
опечатался
venil @ 30.07.2008, 16:58 #
вообще-то можно. и работает. и join по ним можно. десятки раз проверено. последний раз - сегодня. только тормозит. потому и написал заметку.
July 31st, 2008 at 10:16 Quote
Filosoff @ 30.07.2008, 17:33 #
вот что я получаю:
venil @ 31.07.2008, 10:16 #
версия MySql: 5.0.51a-3ubuntu5.1
July 31st, 2008 at 10:28 Quote
никогда такого не встречал, если честно. хотя это возможное поведение...
July 31st, 2008 at 11:25 Quote
я немного погуглил по этому поводу:
venil @ 31.07.2008, 11:25 #
July 31st, 2008 at 11:27 Quote
ага, ясно. буду знать :)
August 6th, 2008 at 10:55 Quote
А есть, какая нибудь альтернатива? ;)
August 18th, 2008 at 03:19 Quote
спасибо