如何优化我的 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 查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何优化我的 Firebird SQL 查询?

如何优化 SQL 查询(Oracle 数据库)

sql查询速度慢如何优化

如何优化“最新销售”sql 查询?

如何使用交叉连接优化 SQL 查询

如何针对 db2 数据库优化 SQL/Python 选择查询?