Нужен индекс для простого запроса, пожалуйста - PullRequest
0 голосов
/ 18 января 2019

Кто-нибудь может предложить хороший индекс для ускорения выполнения этого запроса?

SELECT 
    s.*, 
    sl.session_id AS session_id, 
    sl.lesson_id AS 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'))

Объясните:

id | select_type | table | partitions | type | possible_keys  | key  | key_len | ref                | rows | filtered  | Extra
1  | SIMPLE      | s     | NULL       | ALL  | PRIMARY        | NULL | NULL    | NULL               | 2993 | 0.50      | Using where
1  | SIMPLE      | sl    | NULL       | ref  | session_id,ix2 | ix2  | 4       | ealteach_main.s.id | 5    | 100.00    | Using index

cdu_sessions выглядит так:

------------------------------------------------
id                            | int(11)
name                          | varchar(255)
map_location                  | enum('classroom', 'school'...)
sort                          | tinyint(1)
sort_titles                   | tinyint(1)
friend_gender                 | enum('boy', 'girl'...)
friend_name                   | varchar(255)
friend_description            | varchar(2048)
friend_description_format     | varchar(128)
friend_description_audio      | varchar(255)
friend_description_audio_fid  | int(11)
enabled                       | tinyint(1)
created                       | int(11)
teacher_id                    | int(11)
custom                        | int(1)
------------------------------------------------

cdu_sessions_lessons содержит 3 поля - id, session_id и lesson_id

Спасибо!

Ответы [ 3 ]

0 голосов
/ 18 января 2019

глядя на условие где вы можете использовать составной индекс для таблицы cdu_sessions

create index idx1 on cdu_sessions(teacher_id, sort, enabled);

и ищет присоединиться и выбрать для таблицы cdu_sessions_lessons

create index idx2 on cdu_sessions_lessons(session_id, lesson_id);
0 голосов
/ 18 января 2019

Во-первых, напишите запрос, чтобы преобразование типов не требовалось. Все сравнения в предложении 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);
0 голосов
/ 18 января 2019

Без учета плана запроса, количества строк и распределения в каждой таблице трудно предсказать хороший индекс, чтобы он работал быстрее.

Но я бы сказал, что это может помочь:

> create index sessions_teacher_idx on cdu_sessions(teacher_id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...