У меня есть очень большая таблица (~ 100 миллионов записей) в MySQL, которая содержит информацию о файлах. Одной из частей информации является дата изменения каждого файла.
Мне нужно написать запрос, который будет подсчитывать количество файлов, которые соответствуют указанным диапазонам дат. Для этого я создал небольшую таблицу, которая задает эти диапазоны (все в днях) и выглядит так:
DateRanges
range_id range_name range_start range_end
1 0-90 0 90
2 91-180 91 180
3 181-365 181 365
4 366-1095 366 1095
5 1096+ 1096 999999999
И написал запрос, который выглядит так:
SELECT r.range_name, sum(IF((DATEDIFF(CURDATE(),t.file_last_access) > r.range_start and DATEDIFF(CURDATE(),t.file_last_access) < r.range_end),1,0)) as FileCount
FROM `DateRanges` r, `HugeFileTable` t
GROUP BY r.range_name
Однако, вполне предсказуемо, этот запрос выполняется вечно. Я думаю, это потому, что я прошу MySQL пройти HugeFileTable 5 раз, каждый раз выполняя вычисление DATEDIFF () для каждого файла.
Вместо этого я хочу просмотреть запись HugeFileTable по записи только один раз, и для каждого файла увеличить значение счетчика в соответствующем итоговом числе range_name. Я не могу понять, как это сделать ....
Может кто-нибудь помочь с этим?
Спасибо.
РЕДАКТИРОВАТЬ : версия MySQL: 5.0.45, таблицы MyISAM
EDIT2 : вот описание, которое было запрошено в комментариях
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE r ALL NULL NULL NULL NULL 5 Using temporary; Using filesort
1 SIMPLE t ALL NULL NULL NULL NULL 96506321