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тыс строк. Стоит ли на это обратить внимание ?
Эти числа примерные, не стоит, порядок один и тот же.
Благодарю за ответ
Обсуждают сегодня