MySQL优化查询
我正试图优化这个查询,因为它花费的时间太长(主要是将数据复制到Tmp表)。MySQL优化查询,mysql,query-optimization,Mysql,Query Optimization,我正试图优化这个查询,因为它花费的时间太长(主要是将数据复制到Tmp表)。 结构很简单,一个名为UserCourseProgress的表和另一个名为UserRoles的表,它们都有UserId列,我选择属于超级用户的所有UserRoles。有什么想法吗?使用EXPLAIN获取查询执行计划。然后,查看更耗时的步骤,并在必要时使用索引 使用UNION SELECT (UserCourseProgress.TimeEnded - UserCourseProgress.TimeStarted)
结构很简单,一个名为
UserCourseProgress
的表和另一个名为UserRoles
的表,它们都有UserId
列,我选择属于超级用户的所有UserRoles
。有什么想法吗?使用EXPLAIN获取查询执行计划。然后,查看更耗时的步骤,并在必要时使用索引
使用UNION
SELECT
(UserCourseProgress.TimeEnded - UserCourseProgress.TimeStarted) as SecondsSpent,
UserCourseProgress.UserId
FROM
UserCourseProgress
INNER JOIN UserRoles
ON UserCourseProgress.UserId = UserRoles.UserId
AND (UserRoles.SuperId = '123' OR UserRoles.UserId = '123')
添加索引
SELECT
(UserCourseProgress.TimeEnded - UserCourseProgress.TimeStarted) as SecondsSpent,
UserCourseProgress.UserId FROM UserCourseProgress
INNER JOIN UserRoles ON UserCourseProgress.UserId = UserRoles.UserId
AND UserRoles.SuperId = '123'
UNION
SELECT
(UserCourseProgress.TimeEnded - UserCourseProgress.TimeStarted) as SecondsSpent,
UserCourseProgress.UserId FROM UserCourseProgress
INNER JOIN UserRoles ON UserCourseProgress.UserId = UserRoles.UserId
AND UserRoles.UserId = '123';
请确保您在
UserRoles.SuperId
和UserRoles.UserId
以及FKUserCourseProgress.UserId
上都有索引。您能给出表格结构并稍作解释吗,
ALTER TABLE UserCourseProgress ADD INDEX (UserId);
ALTER TABLE UserRoles ADD INDEX (SuperId, UserId);
ALTER TABLE UserRoles ADD INDEX (UserId);