2010-09-10 5 views
2

У меня проблема с довольно медленным запросом MYSQL. Я создаю меню AJAX с PHP, и производительность действительно является проблемой. Запрос занимает около 0,5 секунды, и я не знаю, как его оптимизировать.Как оптимизировать мой SQL-запрос?

SQL-запрос:

SELECT M.nom_mat, M.id_mat, M.rang, SC.nom_sous_cat, SC.id_sous_cat, C.nom_cat,M.id_cat 
FROM besson_mat M 
LEFT OUTER JOIN besson_lien_mat LM ON M.id_mat = LM.id_mat 
LEFT OUTER JOIN besson_sous_cat SC ON SC.id_sous_cat = LM.id_sous_cat 
LEFT OUTER JOIN besson_cat C ON C.id_cat = SC.id_cat 
WHERE M.en_ligne = '1' 
AND M.lg = 'fr' 
AND (
M.id_cat = '28' 
OR M.id_cat = '29' 
) 
OR (
SC.id_sous_cat = '37' 
OR SC.id_sous_cat = '42' 
OR SC.id_sous_cat = '43' 
OR SC.id_sous_cat = '44' 
) 
ORDER BY C.id_cat ASC , SC.id_sous_cat ASC , M.rang ASC 

Спасибо за вашу помощь, я буду обновлять свой вопрос, если вам нужно больше информации.

FINAL EDIT

Лишние скобки в предложении WHERE были причиной этой проблемы. Теперь мой запрос занимает около 0.0718 секунд, и вам большое спасибо.

ответ

1

Обычно вы можете поместить индексы на любой из столбцов, используемых в ваших предложениях JOINS, WHERE и ORDER BY.

Если это не поможет, используйте интерфейс разработки баз данных, чтобы составить план объяснения по запросу, чтобы увидеть, где он забивается.

Вы можете попробовать поставить результаты своего плана объяснения здесь.

+1

Кроме того, в этом случае вы могли бы иметь проблема синтаксиса. Вы уверены, что не хотите иметь дополнительный набор круглых скобок вокруг последних двух частей предложения where? –

+0

Спасибо, дополнительные скобки были причиной моей проблемы. Теперь мой запрос быстро вспыхивает. – rcampistron

0

Не следует Соединяться только для фильтрации, вы можете использовать существующее или не существующее условие, это лучше.

Возможно, удалите ваш заказ по предложению и выполните сортировку в своем приложении.

и вы можете также объявления некоторого индекса в столбце Ид, Л.Г. и en_ligne

Avec Plaisir и др Bienvenu Сюр SO

2

Вы можете использовать column IN(id1, id2, id3,...) синтаксис вместо того, что многие ОШ.

Во-вторых, Mysql имеет EXPLAIN <statement> команду, которая дает вам некоторые намеки, что он делает и как можно оптимизировать запрос (индекс использования, редизайн стыки и т.д.) См http://dev.mysql.com/doc/refman/5.0/en/explain.html

+0

+1 для команды 'EXPLAIN'. Я думаю, что внутренне 'IN()' и 'or' будут оптимизированы примерно одинаково (другими словами, я не думаю, что выигрыш будет много, если вообще). Но 'EXPLAIN' должен показать, почему он медленный ... – ircmaxell

+0

Вы, вероятно, прав насчет IN, но его короче;) – ZeissS

+0

О, с точки зрения удобочитаемости,' IN() 'является НАГРУЗКАми лучше. И IMHO Я склоняюсь к удобочитаемости по длине (и производительности, если только это не известно как узкое место) ... – ircmaxell

Смежные вопросы