2014-03-14 4 views
0

У меня медленный запрос MySQL, который использует DATE и CURDATE. Таблицы используются являются:Как исправить медленную MySQL CURDATE Group по запросу

журналы L = 1,760,000 записей (индексы на обновляемые и client_id) клиентов с = 4167 записей (индекс по первичному ключу client_id)


SELECT LEFT(c.client,12) client , COUNT(l.client_id) amount 
FROM logs l, customers c 
WHERE c.client_id = l.client_id 
AND c.client_id NOT IN (5,7,217) 
AND DATE(l.updated) = CURDATE() 
GROUP BY l.client_id ORDER BY Amount DESC LIMIT 5 

Когда я запускаю это запрос занимает 8 секунд. Теперь я понимаю, что таблица журналов имеет близкую к 2MLN записи, но я только прошу, чтобы она получила мой счет сегодня (CURDATE), разве оптимизатор запросов MySQL не получает самые последние записи и не суммирует их с клиентами? Казалось бы взять намного меньше

Explain, для КЭ выше запроса указывает:


1 SIMPLE customer ALL PRIMARY Key(null) ref(null) rows 4167 Using where,using temp,filesort 

1 SIMPLE logs ref user_id,idx_client_id user_id rows 5 Using Where 

Любые предложения будут оценены

ответ

0

Он не будет использовать индекс. Вместо этого попробуйте перейти на датифф.

SELECT LEFT(c.client,12) client , COUNT(l.client_id) amount 
FROM logs l, customers c 
WHERE c.client_id = l.client_id 
AND c.client_id NOT IN (5,7,217) 
AND DATEDIFF(l.updated, curdate()) = 0 
GROUP BY l.client_id ORDER BY Amount DESC LIMIT 5 
+0

Спасибо, я пробовал это, но все еще не улучшал производительность. То же, что и раньше. – user265505