2014-11-12 3 views
0

У меня есть таблица базы данных с 5 миллионами строк, я бегу:Почему этот запрос диапазона дат так медленно?

select 
    * 
from 
    tbl 
where 
    datetime_created 
between 
    '2014-10-01 00:00:00' and 
    '2014-10-31 23:59:59' 

потребовалось 54 секунд, чтобы вернуть 428k результаты

Колонны на ТПС:

id (int pk auto inc) 
actor (varchar) 
action (enum) 
target (varchar) 
is_successful (tinyint) 
datetime_created (datetime) 

Индекс :

datetime_created (datetime_created, action, target, is_successful) 

Любые идеи о том, как я могу улучшить это?

редактировать:

EXPLAIN результаты:

select_type: simple 
type: range 
possible keys 
datetime_created 
key: datetime_created 
key_len: 8 
ref: null 
rows: 359569 
extra: using index condition 
+0

префикс объяснить перед запросом и посмотреть, что он делает – Khanna111

+0

explain: select_type: simple, type: range, возможные ключи: datetime_created, key: datetime_created, key_len: 8, ref: null, rows: 359569, extra: using index условие – john

+0

объясняет, что он использует индекс, но производительность по-прежнему очень плохая. – john

ответ

0

428k много строк, чтобы работать с одним выстрелом. Несмотря на то, что у вас есть указатель на дату, движок все еще должен сканировать таблицу между высокими и низкими значениями. Я бы предложил несколько запросов, считывающих данные в более мелкие куски и, по возможности, суживая набор результатов.

E.g. Попробуйте добавить фильтр перечислений действий вместе с диапазоном дат, чтобы получить гораздо более быстрые результаты. Скажем, что существует 5 типов перечислений, тогда вы запускаете 5 запросов для каждого перечисления действий. Чем больше индексированных критериев вы добавите, тем лучше будет запрос.

Также рассмотрите, будет ли это использоваться в приложении, это массивный набор записей, с которым нужно иметь дело. Вам действительно нужно работать с результатами 428k за раз?

+0

Это, по сути, таблица базы данных, которую я использую как «журнал» - мне нужно сделать подсчет, основанный на разных типах действий и т. Д. – john

+0

Итак, вам нужно сделать агрегацию. Если вы добавите в свою группу по заявлению о действии, то лучше использовать индекс. – Avner

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