2016-07-27 3 views
0

Мы имеем довольно большой MySql Innodb таблицу со следующим родом статистики,MySql Диапазон данных оптимизация запросов

Rows - 8277943+      Server Ram - 128 Gb 
Avg row Length - 575    Processor - Deca Core Intel 
Data Size - 4.4 GB     Overall Database Size - 500Gb 

Проблема заключается у нас есть несколько запросов на этой таблице, и теперь они работают очень медленно, и я бегу из идей для оптимизации. Например, некоторые запросы приведены ниже,

select TIMESTAMPDIFF(SECOND,w.msgCreatedOn,now()) as rnge 
from t_xxx_dtls w 
where w.profileId=17901 
    and w.orgId=1448 
    and w.actionStartDate BETWEEN '2016-07-27 05:08:00' and '2016-07-27 13:08:59' 
    and w.currentlyActive=true and w.`action` not in (6,9,17) 
    and (
    w.parentId NOT in (
     select CASE WHEN d.parentId IS NOT NULL THEN d.parentId ELSE d.id END as ticketId 
     from t_xxx_dtls d where d.profileId=17901 and d.orgId=1448 and d.actionStartDate  BETWEEN '2016-07-27 05:08:00' and '2016-07-27 13:08:59' and d.action in (2,4,7) 
     group by ticketId 
    ) 
    or (w.parentId is null and w.inReplyId is null) 
    ) 
    and w.msgId is not null 
order by rnge desc 
limit 0,1 

Explain Plan Explain Plan

В то время как у нас есть простые запросы, как один ниже, которые начинают застревать,

select count(*) 
from t_xxx_dtls d 
where d.actionStartDate BETWEEN '2016-07-27 05:08:00' and '2016-07-27 13:08:59' 

Это в соответствии с планом объяснить проверяет очень большое количество записей, как это можно улучшить. Я читаю о разделе, но теперь уверен, что это может помочь.

+1

Просьба показать структуру таблицы. У вас есть указатель на actionStartDate? – rlanvin

+0

Пожалуйста, покажите версию mysql, создайте индексы, базу данных oltp или olap, ... –

ответ

0

Для первого показанного запроса я бы подумал, что индекс на (orgId, profileId, actionStartDate) в этом порядке будет полезен.

Однако это не помогло бы для более простого второго запроса; что выиграет от индекса, начинающегося с actionStartDate. Первый запрос мог бы также воспользоваться таким индексом, но я не уверен, что MySQL будет использовать последние части индекса (actionStartDate, orgId, profileId), когда используется условие actionStartDate BETWEEN.

Смежные вопросы