2010-09-10 38 views
2

我有一個很慢的MYSQL查詢的問題。我正在用PHP構建一個AJAX菜單,並且性能確實是一個問題。查詢大約需要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 

感謝您的幫助,如果你需要更多的細節我會更新我的問題。

最後編輯

WHERE子句中的額外的括號是問題的原因。現在我的查詢需要大約0.0718秒才能完成,非常感謝。

回答

1

通常,您可能會考慮將索引放在JOINS,WHERE子句和ORDER BY子句中使用的任何列上。

如果這沒有幫助,請使用您的數據庫開發接口對查詢執行解釋計劃,以查看它在何處停滯。

您可以嘗試將解釋計劃的結果放在此處。

+1

而且,看來你可能有一個語法問題。你確定你不想在where子句的最後兩個部分附加一組括號嗎? – 2010-09-10 15:28:36

+0

謝謝,額外的括號是我的問題的原因。現在我的查詢很快。 – rcampistron 2010-09-11 16:32:23

0

不要做只加入到過濾器,你可以使用存在或不存在的子句,它更好。

也許刪除您的訂單的條款,並在您的應用程序中進行排序。

,你也可以廣告的一些指數在你的id列,LG和en_ligne

AVEC Plaisir的等卞福汝河畔SO

2

您可以使用column IN(id1, id2, id3,...)語法,而不是許多手術室。

二,MySQL有一個EXPLAIN <statement>命令,它給你一些提示,它做什麼,以及如何可以優化您的查詢(使用索引,重新設計連接等) 見http://dev.mysql.com/doc/refman/5.0/en/explain.html

+0

用於'EXPLAIN'命令的+1。我在內部認爲'IN()'和'or'會被優化到大致相同(換句話說,我認爲增益不會太大)。但'EXPLAIN'應該說明爲什麼它很慢...... – ircmaxell 2010-09-10 17:26:38

+0

你可能是對的,但它的更短;) – ZeissS 2010-09-10 19:05:31

+0

哦,從可讀性的角度來看,IN()的LOADS更好。恕我直言,我傾向於贊成可讀性的長度(和性能,除非它已知是一個瓶頸)... – ircmaxell 2010-09-10 19:40:05