MySQL查询超时 - 需要加快速度

时间:2013-05-31 20:28:53

标签: mysql sql

我在这里发出了一个查询,它可以检索与连接不匹配的结果(如此SO问题所示)。

SELECT cf.f_id
FROM comments_following AS cf
INNER JOIN comments AS c ON cf.c_id = c.id
WHERE NOT EXISTS (
    SELECT 1 FROM follows WHERE f_id = cf.f_id
)

关于如何提高速度的任何想法?它有三万到二十万行,它看起来正在使用索引,但查询超时。

EXPLAIN / DESCRIBE信息:

1   PRIMARY c   ALL PRIMARY NULL    NULL    NULL    39119   
1   PRIMARY cf  ref c_id, c_id_2    c_id    8   ...c.id 11  Using where; Using index
2   DEPENDENT SUBQUERY  following   index   NULL    PRIMARY 8   NULL    35612   Using where; Using index

3 个答案:

答案 0 :(得分:1)

LEFT JOIN有时会比那些不存在subquerys更快,尝试:

SELECT cf.f_id
FROM comments_following AS cf
INNER JOIN comments AS c ON cf.c_id = c.id
LEFT JOIN follows AS f ON f.f_id = cf.f_id
WHERE f.f_id IS NULL

答案 1 :(得分:1)

查询中未明确使用comments表。它被用于过滤吗?如果没有,请尝试:

SELECT cf.f_id
FROM comments_following cf
WHERE NOT EXISTS (
    SELECT 1 FROM follows WHERE follows.f_id = cf.f_id
)

顺便说一句,如果这会产生语法错误(因为follow.f_id不存在),那就是问题所在。在这种情况下,你会认为你有一个相关的子查询,但实际上并没有一个。

left outer join版本:

SELECT cf.f_id
FROM comments_following cf left outer join
     follows f
     on f.f_id = cf.f_id
where f.f_id is null

follows(f_id)上建立索引应该会使这两个版本运行得更快。

答案 2 :(得分:0)

这个问题的答案是在follows.f_id上放置第二个索引。