У меня следующий запрос:
SELECT
`date`,
al.cost,
SUM(l.bnd) AS bnd,
l.type,
count(*) AS amount
FROM alogs AS al
INNER JOIN logs AS l ON al.logid = l.id
WHERE
aid = 0 AND
l.`date` >= '2010-01-17' AND
l.`date` <= '2011-04-19'
GROUP BY l.`date`, l.type
logs насчитывает 5 миллионов строк
alogs насчитывает 4,3 миллиона строк
время выполнения составляет около 90 секунд.
У меня есть:
первичный ключ на logs.id (auto inc)
индекс (BTREE) на logs.date
индекс (BTREE) на alogs.logid
индекс (BTREE) на alogs.aid
Я пытался:
- индекс (BTREE) для logs.type, но это ничего не улучшило (я думаю, потому что тип может быть только 2 вещами)
- индекс покрытия для журналов.date и logs.type
- внутреннее разбиение таблицы журналов по месяцам, но с указанным выше временным интервалом (который охватывал все разделы) он стал бы даже медленнее, не может разбить на части при помощи, поскольку существует более 2 000 различныхid
- удаление функций из запроса до тех пор, пока не станет быстро увидеть, в чем проблема.
Мне нужно было только удалить предложение GROUP (и функции SUM () и count (*) для получения правильных результатов)и таким образом время выполнения стало меньше секунды.
-удалите предложение group и group в памяти, но результат более 3 миллионов строк был слишком большим и занял бы больше времени.
Могу ли я сделать что-то еще, но я не знаю?Если так, я бы хотел услышать об этом!
Спасибо,
lordstyx
EDIT (2011-04-22 11:30) Вот результат EXPLAIN EXTENDED
id| select_type| table| type | possible_keys| key | key_len| ref | rows | Extra
1 | SIMPLE | al | ref | logid,aid | adid | 4 | const | 3010624| Using temporary; Using filesort
1 | SIMPLE | l | eq_ref| PRIMARY,date | PRIMARY| 4 | al.logid| 1 | Using where