我正在尝试优化这个mysql查询

时间:2014-03-20 18:27:52

标签: mysql

对于这个愚蠢的查询我已经超过12秒了

SELECT *
FROM notifications
WHERE `to` IN (SELECT following FROM followers WHERE follower = 3)
LIMIT 0,20

知道问题可能是什么?我应该使用加入吗?

1 个答案:

答案 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)