我在这里发出了一个查询,它可以检索与连接不匹配的结果(如此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
答案 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
上放置第二个索引。