Во-первых, напишите запрос, чтобы преобразование типов не требовалось. Все сравнения в предложении where
относятся к числам, поэтому используйте числовые константы:
SELECT s.*,
sl.session_id, -- unnecessary because s.id is in the result set
sl.lesson_id
FROM cdu_sessions s INNER JOIN
cdu_sessions_lessons sl
ON sl.session_id = s.id
WHERE s.sort = 1 AND
s.enabled = 1 AND
s.teacher_id IN (193, 1, 168, 1797, 7622, 19951);
Хотя это может и не происходить в данном конкретном случае, типы смешивания могут препятствовать использованию индексов.
Я удалил столбец как псевдонимы (например, as session_id
). Они были избыточными, потому что имя столбца является псевдонимом, а запрос не менял имя.
Для этого запроса сначала посмотрите на предложение WHERE
. Все ссылки на столбцы взяты из одной таблицы. Они должны идти в индексе, сначала сравнения равенства:
create index idx_cdu_sessions_4 on cdu_sessions(sort, enabled, teacher_id, id)
Я добавил id
, потому что он также используется в JOIN
.
Формально id
не требуется в индексе, если это первичный ключ. Тем не менее, мне нравится быть явным, если я хочу это там.
Далее вам нужен индекс для второй таблицы. Оттуда ссылаются только два столбца, поэтому они оба могут войти в индекс. Первый столбец должен быть тем, который используется в join
:
create index idx_cdu_sessions_lessons_2 on cdu_sessions_lessons(session_id, lesson_id);