我在 MYSQL 中使用 IN 查询时遇到性能问题。
基本上我正在构建一个 friend 图,当用户 ~< 5 个 friend 时,爬行速度会变慢
然而,对于拥有大量好友(7000+)的用户 - 它运行速度 super 快。
这是我的模拟查询:
SELECT *
FROM activity
WHERE user_id IN
(
SELECT friend_id
FROM friends
WHERE user_id = 1 and approved = 1
)
order by activity.created_at DESC
LIMIT 25
出于某种原因,如果 user_id 有 < 5 个 friend ,则查询需要 15 秒才能返回 0 个条目。
在 friend 表上,我有一个关于 user_id 的索引并已批准。在事件条目上,我在created_at上有一个索引。
有什么建议或重构吗?
最佳答案
基本上,示例中的子查询将针对从 activity
表中选择的每一行执行,您可以通过将 activity
表上的过滤器移至外部范围来减少它,因此尝试使您的顶级查询在过滤方面更加具体。
尝试INNER JOIN
,它工作得更快吗?
SELECT * FROM activity a
INNER JOIN friends f ON a.user_id = f.friend_id
WHERE a.user_id = 1 AND f.approved = 1
order by activity.created_at DESC LIMIT 25
几个问题:
- 两个表都有 user_id 列?
- friend 表中的列已批准吗?
关于mysql - 如何提高子查询的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7012762/