如何减少此 mysql 查询执行时间

How to decrease this mysql query execution time

这是我的 MySQL 查询:

select en.course_instance_id, count(*) 
from user u 
inner join enrollment en on en.user_id = u.user_id 
where en.account_id=5392 
  and en.course_instance_id in (5127039, 5127040) 
  and enrollment_state='ACTIVE' 
  and u.state!='DELETED' 
group by en.course_instance_id;

我的 user table 有 user_id 作为主键,enrollment table 有 (user_id, course_id) 作为主键。

基本上,此查询试图查找每个 course_instance.

中注册的用户数量

现在,course_instance_id 5127039 注册了 352438 名用户,course_instance_id 5127040 注册了 1 名用户。

当我尝试 运行 这个查询时,它会超时(它需要超过 2 分钟)。

我检查了两个 table 的索引,我假设它们使用正确。对于 enrollment table 使用 course_instance_id, course_id 的索引,对于 user 使用 table 主索引,即使用 user_id

已附加用于此查询的索引的快照:

从概念上讲,我认为您的查询会像这样更清楚。输出应该是相同的,但 mysql 对 join 子句上对用户的所有限制可能更满意。我不确定 table enrollment_state 来自哪个。

select en.course_instance_id, count(*) 
from enrollment en
inner join user u on en.user_id = u.user_id and u.state!='DELETED'
where en.account_id=5392 
  and en.course_instance_id in (5127039, 5127040) 
  and enrollment_state='ACTIVE' 
group by en.course_instance_id;

对于此查询:

select en.course_instance_id, count(*) 
from user u inner join
     enrollment en 
     on en.user_id = u.user_id 
where en.account_id = 5392 and
      en.course_instance_id in (5127039, 5127040) and 
      en.enrollment_state = 'ACTIVE' and
      u.state <> 'DELETED' 
group by en.course_instance_id;

我会推荐 enrollment(account_id, enrollment_state, course_instance_id, user_id) 上的索引。

您可以在 users(user_id, state) 上添加索引,但这并不是真正需要的,因为 user_id 可能是主键。