【问题标题】:Slow MySQL query when using ORDER BY使用 ORDER BY 时 MySQL 查询慢
【发布时间】:2015-07-31 07:51:44
【问题描述】:

我有这个问题:

SELECT article.id
FROM article
INNER JOIN article_cCountry ON article.id = ID1 AND ID2 = 1
INNER JOIN user_cCountry ON article.uId = user_cCountry.ID1 AND user_cCountry.ID2 = 1
LEFT JOIN user ON article.uId = user.ID
WHERE article.released = "TRUE"
AND article.sDate < now()
AND article.cDate != "0000-00-00 00:00:00"
AND (article.eDate > now() OR article.eDate = 0)
AND ( (user.released = true) OR (article.uId = 0) )
ORDER BY article.cDate DESC
LIMIT 0, 10

查询需要 ~0.3 秒,没有 ORDER BY 只需 ~0.001 秒。

知道为什么 ORDER BY 这么慢吗?

编辑 解释:

编辑 2 索引

【问题讨论】:

  • explain select... 显示了什么,好像 order by 子句中使用的列没有被索引。
  • @AbhikChakraborty 查看编辑
  • 那是正确的,您的架构缺少一些索引我建议让索引article(released,sDate) and user(released)... 备份表并查看现有索引,如果尚未添加上述索引,请添加它们.
  • @AbhikChakraborty 好的,我已经添加了提到的索引,但仍然有 ~0.2 秒。还有其他优化的可能吗?

标签: mysql performance


【解决方案1】:

如果没有ORDER BY,您的查询将在 10 行 (LIMIT) 后终止。

ORDER BY 需要生成完整的结果集,排序,然后返回前 10 行。

【讨论】:

    【解决方案2】:

    虽然你永远无法达到只输出 10 行而不是取所有行然后对 em 排序然后输出前 10 行的速度,但你可以做一些小技巧来对内存中的记录集进行排序

    SELECT id FROM (
     SELECT article.id,article.cDate
     FROM article
     INNER JOIN article_cCountry ON article.id = ID1 AND ID2 = 1
     INNER JOIN user_cCountry ON article.uId = user_cCountry.ID1 AND user_cCountry.ID2 = 1
     LEFT JOIN user ON article.uId = user.ID
     WHERE article.released = "TRUE"
     AND article.sDate < now()
     AND article.cDate != "0000-00-00 00:00:00"
     AND (article.eDate > now() OR article.eDate = 0)
     AND ( (user.released = true) OR (article.uId = 0) )
    )
    ORDER BY cDate DESC
    LIMIT 0, 10
    

    希望有帮助

    【讨论】:

    • 很遗憾没有。速度一样
    【解决方案3】:
    INDEX(released, cDate)
    

    可能有帮助

    避免OR 可能会有所帮助。

    【讨论】:

      【解决方案4】:

      您的 ORDER BY 列 (article.cDate) 应该被索引,这将停止 ORDER BY article.cDate 花费很长时间,因为列值将被索引,然后可以以指数速度更快地排列。

      【讨论】:

      • 列被索引
      猜你喜欢
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      • 2021-04-22
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多