#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. Не совсем правильно, так как мне нужно найти количество найденных этих полей