Как я могу ускорить запрос в MySQL?

#mysql #database #select

Вопрос:

У меня есть столик —

 create table LiveMovie
(
    id           int auto_increment
        primary key,
    pitchID          int                                  not null,
    UID              char(20)                             null,
    roomID           int                                  not null,
    imgID            int                                  not null,
    start_time       datetime                             not null,
    request_index      int                                not null,
    constraint live__uid
        unique (UID)
)

create index live_pitchID_roomID
    on LiveMovie (pitchID, roomID);

create index live_roomID_time
    on LiveMovie (roomID, start_time);
 

В котором насчитывается около 5 миллионов записей.
И по запросу — SELECT COUNT(*) FROM (SELECT pitchID FROM LiveMovie WHERE roomID=? GROUP BY pitchID) AS counter; запрос занимает около 15 секунд
Могу ли я как-то ускорить запрос?
План выполнения —

 ID   select_type  table         type   possible_key            key      key_len     ref    rows      Extra
'1', 'PRIMARY',  '<derived2>',  'ALL',    NULL,                NULL,    NULL,      NULL,   '19',     NULL
'2', 'DERIVED', 'LiveMovie',    'ref', 'live_roomID_time', 'live_roomID_time', '4', 'const', '19', 'Using where; Using temporary; Using filesort'
 

Комментарии:

1. Да, конечно. Почему бы не добавить индекс к полям, которые вы фильтруете?

2. Почему бы вам не посчитать прямо на столе?

3. Кроме того, можете ли вы поделиться планом выполнения для данного запроса?

4. @NicoHaase Извините, я написал здесь неправильный индекс

Ответ №1:

У меня был бы индекс, основанный на вашем условии WHERE, сначала в индексе, ЗАТЕМ в группе, например

 index on (roomId, pitchID)
 

Тогда, поскольку все, что тебя волнует, — это сколько их, я бы сделал

 select count( distinct pitchID )
   FROM LiveMovie 
   WHERE roomID = ?
 

Имея индекс по комнатам, вы сначала получаете только эти записи и заканчиваете. Если значение pitchid будет находиться во второй позиции, это позволит оптимизировать результат подсчета различных значений.

Ответ №2:

Почему вы выбираете дважды? Попробуй это:

 SELECT COUNT(pitchID) as counter FROM LiveMovie WHERE roomId=? GROUP BY pitchID;
 

Комментарии:

1. Не совсем правильно, так как мне нужно найти количество найденных этих полей