我的SQL查询如何优化?

时间:2010-09-10 15:24:20

标签: php mysql query-optimization

我遇到了一个非常慢的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秒才能完成,非常感谢你。

3 个答案:

答案 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