mysql - 如何提高子查询的性能?

标签 mysql sql indexing

我在 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/

相关文章:

Drupal 与近实时搜索 Solr

R基于零还是基于一?

mysql - 找出今天和特定日期之间的天数?

php - 如何将 implode() 的数组元素结果插入每一行?

sql - 为什么 SQL Server 2008 Management Studio 没有选项 "Open table"

mysql - 计算有多少行具有相同的值

mysql - 在 Rails 迁移中删除表中的所有列

mysql - sql 组不超过 2 个不同的特定值

sql - 如何让以下 SQL 查询正确选择组内的前 N ​​个结果?

postgresql - 嵌套整数字段上的 Postgres jsonb 索引