我的查询类似于:
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秒。为什么呢?
答案 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}}