2014-12-26 5 views
0

У меня есть база данных mysql с 50 ГБ данными и записью 200M в таблице. Я выполняю следующий запрос, и для его заполнения требуется около 350 секунд:Оптимизация очень огромной таблицы mysql (query или mysql)

SELECT x_date, count(*) as totl 
    FROM `rec_ex_15` 
    WHERE x_date > '2014-12-01' 
     and typx = '2' 
    group by x_date 
    order by x_date desc 

x_date и typx индексируются.

Вот объясните:

id  select_type table  type  possible_keys key  key_len ref rows 
1  SIMPLE  rec_ex_15 range typx,x_date x_date 3  NULL 15896931 Using where 

Есть ли способ, чтобы получить результат быстрее?

+0

У вас есть указатель конкретно на (typex, xdate), а не индивидуально. – DRapp

+0

нет у меня есть только индивидуальный – blacksun

ответ

2

Как отмечено в комментарии ... ваш запрос очень прост. Лучше всего иметь индекс покрытия/составного соединения (typx, x_date)

Вначале typx = '2', тогда индекс может перейти непосредственно к критериям даты и получить результаты.

Вы можете (в будущем, рассмотреть вопрос о создании отдельной сводной таблицы, например, счетчики на каждый тип и дату, а затем получить агрегаты с, что если вы имеете дело с 200м записей.

Разъяснение индекс (typx, x_date)

Поскольку вы ищете конкретную «typx», вы хотите, чтобы в первой позиции индекса и вторичного элемента была x_date. Подумайте об индексе, как о комнате ящиков. В каждом ящике содержится только один экземпляр «typx» "значение (1, 2, 3 и т. д.) ... В поле для (в вашем случае typx = '2') они затем сортируются по x_date. Таким образом, в поле для typx = 2 вы можете перейти непосредственно на соответствующую дату, возьмите записи и сделайте это.

Если индекс был основан только на x_date (как у вас есть), предположите, что каждое поле в комнате содержит одну дату. Да, вы можете перейти непосредственно к дате начала своего списка, но затем вам нужно войти в поле и просмотреть все записи, чтобы вытащить любые typx = 2 записи. Теперь закройте окно для первого дня и перейдите к следующей дате коробки и найдите любой typx = 2 и так далее.

Наличие эффективного индекса, основанного на ваших критериях, может значительно помочь в запросах.

+0

Спасибо за ваш ответ. мне нужно оптимизировать my.cnf? также что вы подразумеваете под «The typx = '2« first ». Что вы рекомендуете, рекомендуете ли вы мне создать таблицу, выполнить вычисления и отредактировать ее? – blacksun

+0

@blacksun, исправленный для уточнения индекса – DRapp

+0

большое спасибо. еще один вопрос, что мне нужно сделать, чтобы использовать такой запрос: «SELECT r_pass, count (*) как totl FROM' rec_ex_15' WHERE x_date> '2014-12-01' группой по порядку r_pass по totl desc " – blacksun

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