【问题标题】:Help me optimize this query帮我优化这个查询
【发布时间】:2011-11-25 07:21:39
【问题描述】:

我有一个我正在设计的应用程序的查询。有一个参考表、一个作者表和一个reference_authors 表。有一个子查询返回给定参考的所有作者,然后我以 php 格式显示。子查询和查询单独运行既好又快。但是,一旦将子查询放入主查询中,整个事情就会花费 120 多秒的时间来运行。我会对此有一些新的看法。 谢谢。

SELECT
rf.reference_id,
rf.reference_type_id,
rf.article_title,
rf.publication,
rf.annotation,
rf.publication_year,
(SELECT GROUP_CONCAT(a.author_name)
FROM authors_final AS a
INNER JOIN reference_authors AS ra2 ON ra2.author_id = a.author_id
WHERE ra2.reference_id = rf.reference_id
GROUP BY ra2.reference_id) AS authors
FROM
references_final AS rf
INNER JOIN reference_authors AS ra ON rf.reference_id = ra.reference_id
LEFT JOIN reference_institutes AS ri ON rf.reference_id = ri.reference_id;

这是固定查询。谢谢大家的推荐。

SELECT
rf.reference_id,
rf.reference_type_id,
rf.article_title,
rf.publication,
rf.annotation,
rf.publication_year,
GROUP_CONCAT(a.author_name) AS authors
FROM
references_final as rf
INNER JOIN (reference_authors AS ra INNER JOIN authors_final AS a ON ra.author_id = a.author_id)
ON rf.reference_id = ra.reference_id
LEFT JOIN reference_institutes AS ri ON rf.reference_id = ri.reference_id
GROUP BY rf.reference_id

【问题讨论】:

  • 您是否尝试将子查询重写为内部连接?
  • 我知道我错过了什么,我知道。只是看看你推荐的 catcall 并将子查询重写为内部连接,查询现在需要 0.078 秒。感谢一百万的伙伴。

标签: mysql database optimization query-optimization subquery


【解决方案1】:

虽然不是每个子查询都可以重写为内部连接,但我认为你的可以。

从 120 秒到 78 毫秒是一个不错的改进——大约三个数量级。休息一天。

当你明天回来时,开始在你的源代码中寻找其他子查询。

【讨论】:

    【解决方案2】:

    您说子查询在隔离时很好且速度很快,但它现在显然对每一行都运行 - 100 行 = 100 个子查询。

    假设您在所有外键上都有索引,与子查询一样好。

    一种选择是离开加入作者并创建一个笛卡尔积 - 您将返回更多行,并且需要一些代码来获得相同的最终结果,但它会减少对数据库的压力并且运行速度会更快.

    如果您打开分页并说要返回 10 行,那么发出 10 个单独的调用以将作者隔离开来也很快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-04
      • 2021-02-01
      • 1970-01-01
      相关资源
      最近更新 更多