如何减少此 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
可能是主键。
这是我的 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
可能是主键。