Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL优化查询_Mysql_Query Optimization - Fatal编程技术网

MySQL优化查询

MySQL优化查询,mysql,query-optimization,Mysql,Query Optimization,我正试图优化这个查询,因为它花费的时间太长(主要是将数据复制到Tmp表)。 结构很简单,一个名为UserCourseProgress的表和另一个名为UserRoles的表,它们都有UserId列,我选择属于超级用户的所有UserRoles。有什么想法吗?使用EXPLAIN获取查询执行计划。然后,查看更耗时的步骤,并在必要时使用索引 使用UNION SELECT (UserCourseProgress.TimeEnded - UserCourseProgress.TimeStarted)

我正试图优化这个查询,因为它花费的时间太长(主要是将数据复制到Tmp表)。
结构很简单,一个名为
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
以及FK
UserCourseProgress.UserId
上都有索引。您能给出表格结构并稍作解释吗,
ALTER TABLE UserCourseProgress ADD INDEX (UserId);
ALTER TABLE UserRoles ADD INDEX (SuperId, UserId);
ALTER TABLE UserRoles ADD INDEX (UserId);