对于这个愚蠢的查询我已经超过12秒了
SELECT *
FROM notifications
WHERE `to` IN (SELECT following FROM followers WHERE follower = 3)
LIMIT 0,20
知道问题可能是什么?我应该使用加入吗?
答案 0 :(得分:1)
首先,添加以下"覆盖",多列索引:
followers(follower, following)
MySQL只能运行一次不相关的子查询,但它可能会扫描通知表中的所有行,并将结果与之进行比较。如果通知中有很多行,则此查询可能会很慢。
使用以下格式的JOIN
,MySQL能够立即将结果集减少到关注者为3的关注者表中的那些行:
SELECT n.*
FROM followers f
JOIN notifications n
ON n.`to` = f.following
WHERE f.follower = 3
然后,MySQL将查看每个记录的通知表,其中'到'列匹配。根据您的数据集,这可能比通知的全表扫描更快。
对于JOIN
,您还需要添加以下索引:
notifications(`to`)
如果您可以将结果缩小到几个命名列,那么也将这些命名列添加到索引中以创建覆盖的多列索引:
SELECT n.name, n.notification
FROM followers f
JOIN notifications n
ON n.`to` = f.following
WHERE f.follower = 3
然后是这样的覆盖索引:
notifications(`to`, name, notification)