2014-01-10 4 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'; 

Добавить INDEX

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

работающ отлично! – matt

0

Используйте EXPLAIN для получения плана выполнения запроса. Затем просмотрите более затратные шаги и при необходимости используйте индекс.

EXPLAIN

Смежные вопросы