为什么即使子查询执行速度快,我的子查询的sql查询也这么慢?

时间:2017-11-11 21:59:50

标签: mysql sql performance

我的查询类似于:

SELECT *,
(SELECT COUNT(*) FROM comments WHERE comments.thread = threads.id) AS comments
FROM threads
LIMIT 10

comments.thread是一个索引,像这样的查询运行得很快:

SELECT COUNT(*) FROM comments WHERE comments.thread = 'someId'

但是,我的查询极其缓慢。它需要我定义的限制的10秒。为什么呢?

2 个答案:

答案 0 :(得分:1)

对于此查询:

SELECT t.*,
      (SELECT COUNT(*) FROM comments c WHERE c.thread = t.id) AS comments
FROM threads t
LIMIT 10;

您需要comments(thread)上的索引。如果你的其他查询运行得很快,那么我猜你已经有了一个。

也许LIMIT和子查询的行为很奇怪。这个版本也慢吗?

SELECT t.*,
      (SELECT COUNT(*) FROM comments c WHERE c.thread = t.id) AS comments
FROM (SELECT t.*
      FROM threads t
      LIMIT 10
     ) t;

答案 1 :(得分:1)

您的内部查询是 corelated 子查询,这意味着它使用外部查询中的值,因此对外部查询的每一行执行。也许MySQL不太擅长优化查询。

试试这个:

{{1}}