2014-01-10 89 views
0
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') 

我想优化这个查询,因为它需要很长时间(主要是将数据复制到Tmp表)。 该结构很简单,一个名为UserCourseProgress的表和另一个名为UserRoles的表,他们都有UserId列的共同点,并且我选择属于超级用户的所有userRoles。有任何想法吗?MySQL优化查询

+0

确保您有'UserRoles.SuperId'和'UserRoles.UserId'指标,以及如在FK UserCourseProgress.UserId' – StuartLC

+1

你可以给表结构,并且很少更多解释, – Lijo

回答

2

使用UNION

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'; 

添加索引

ALTER TABLE UserCourseProgress ADD INDEX (UserId); 
ALTER TABLE UserRoles ADD INDEX (SuperId, UserId); 
ALTER TABLE UserRoles ADD INDEX (UserId); 
+0

工作完美! – matt

0

使用EXPLAIN获取查询执行计划。然后,看看更耗费的步骤,并在必要时使用索引。

EXPLAIN