【问题标题】:How can my SQL query be optimized?如何优化我的 SQL 查询?
【发布时间】: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 秒才能完成,非常感谢。

【问题讨论】:

    标签: php mysql query-optimization


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多