如何优化我的 SQL 查询?
Posted
技术标签:
【中文标题】如何优化我的 SQL 查询?【英文标题】:How can my SQL query be optimized? 【发布时间】:2010-09-10 15:24:19 【问题描述】:我遇到了一个非常慢的 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 秒才能完成,非常感谢。
【问题讨论】:
【参考方案1】:您可以使用 column IN(id1, id2, id3,...)
语法来代替那么多 OR。
其次,Mysql 有一个EXPLAIN <statement>
命令,它会为您提供一些提示、它的作用以及如何优化您的查询(使用索引、重新设计连接等)
见http://dev.mysql.com/doc/refman/5.0/en/explain.html
【讨论】:
+1 表示EXPLAIN
命令。我认为在内部IN()
和or
将被优化到大致相同(换句话说,我认为增益不会太大)。但是EXPLAIN
应该说明为什么它很慢......
哦,从可读性的角度来看,IN()
的 LOADS 更好。恕我直言,我更倾向于可读性而不是长度(和性能,除非已知它是一个瓶颈)......
感谢所有提示,我在查询中尝试了 EXPLAIN,但我不明白结果。你能提供一个如何阅读它的链接吗?
你提供的链接够了,我的错。【参考方案2】:
通常,您可能会考虑在 JOINS、WHERE 子句和 ORDER BY 子句中使用的任何列上放置索引。
如果这没有帮助,请使用您的数据库开发界面对查询进行解释计划,看看它在哪里陷入困境。
您可以尝试将解释计划的结果放在这里。
【讨论】:
另外,您可能有语法问题。您确定不想在 where 子句的最后两部分加上额外的括号吗? 谢谢,多余的括号是我的问题的原因。现在我的查询速度很快。【参考方案3】:不要仅仅为了过滤而加入,你可以使用exists或not exists子句,这样更好。
也许删除您的 order by 子句并在您的应用中进行排序。
您还可以在 id 列中添加一些索引,lg 和 en_ligne
Avec plaisir et bienvenu sur SO
【讨论】:
以上是关于如何优化我的 SQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章