我遇到了一个非常慢的MYSQL查询问题。我正在使用PHP构建一个AJAX菜单,性能确实是一个问题。查询大约需要0.5秒才能完成,我不知道如何优化它。
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秒才能完成,非常感谢你。
答案 0 :(得分:2)
您可以使用column IN(id1, id2, id3,...)
语法而不是那么多OR。
其次,Mysql有一个EXPLAIN <statement>
命令,它给你一些提示,它做了什么以及如何优化你的查询(使用索引,重新设计连接等)
见http://dev.mysql.com/doc/refman/5.0/en/explain.html
答案 1 :(得分:1)
通常,您可以考虑将索引放在JOINS,WHERE子句和ORDER BY子句中使用的任何列上。
如果这没有帮助,请使用您的数据库开发界面对查询执行解释计划,以查看它在哪里陷入困境。
您可以尝试将解释计划的结果放在此处。
答案 2 :(得分:0)
不要只做加入过滤,你可以使用exists或not exists子句,它更好。
也许删除您的order by子句并在您的应用中进行排序。
您还可以在id列中添加一些索引,lg和en_ligne
Avec plaisir et bienvenu sur SO