SUM(os.duration_sec) AS duration_sec,
SUM(os.facetime_sec) AS facetime_sec,
SUM(os.distracted_sec) AS distracted_sec,
SUM(os.window_hidden_sec) AS window_hidden_sec
FROM OfflineSessions os
WHERE os.offlineID = ?;'
С такой таблицей:
create table OfflineSessions
(
sessionID int auto_increment
primary key,
offlineID int default 0 not null,
start_time datetime default '0000-00-00 00:00:00' not null,
complete_time datetime default '0000-00-00 00:00:00' not null,
duration_sec int default 0 not null,
facetime_sec int default 0 not null,
distracted_sec int default 0 not null,
window_hidden_sec int default 0 not null,
closed tinyint default 0 not null,
created datetime default '0000-00-00 00:00:00' not null,
modified timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP
)
Индекс:
create index offsession_offID_dur_time
on OfflineSessions (offlineID, duration_sec, complete_time);
Где в худшем варианте, при выборе по offlineId, вернет 40тыс записей. (Время выполнения 20 сек)
Всего записей в таблице 27мил.
Ну, индекс по os.offlineID = ? должен работать, он селективный. А больше особо ничего не сделать.
А, нет, сделать. Можно в индекс включить все эти поля, что суммируются, SUM(os.duration_sec) AS duration_sec, SUM(os.facetime_sec) AS facetime_sec, SUM(os.distracted_sec) AS distracted_sec, SUM(os.window_hidden_sec) AS window_hidden_sec (сейчас не все есть) можно не как ключ, а INCLUDE-ом, если СУБД умеет. Тоже немного ускорит.
Спасибо за ответ. С Инклудом база не уммет ( Смущает только если смотреть через EXPLAINE Старый индекс затрагивает 68тыс строк. Индекс по всем полям затрагивает 81тыс строк. Стоит ли на это обратить внимание ?
Эти числа примерные, не стоит, порядок один и тот же.
Благодарю за ответ
Обсуждают сегодня