У меня следующий запрос:
SELECT IF(dissolution_date IS NULL,
YEAR(CURDATE()) - YEAR(incorporation_date),
YEAR(dissolution_date) - YEAR(incorporation_date)) as length,
COUNT(DISTINCT(id_company)) as count
FROM company
WHERE incorporation_date IS NOT NULL
GROUP BY length
ORDER BY length ASC
Учитывая, что у меня есть дата роспуска (или ее замена) и дата инкорпорации, представляется излишним добавлять в таблицу дополнительный столбец, в котором хранится разница между двумя датами (особенно, если компания не распалась). дата роспуска должна будет обновляться каждый день год).
Вывод EXPLAIN выглядит следующим образом:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
----|-------------|---------|------|--------------------|------|---------|------|----------------------------------------
1 | SIMPLE | company | ALL | incorporation_date | NULL | NULL | NULL | 9128995 | Using where; Using filesort
и в настоящее время запрос занимает 10 секунд, тогда как аналогичные запросы для неисчисляемых столбцов занимают миллисекунды, чего я и хотел бы достичь здесь.
Можно ли сгруппировать и упорядочить по длине без использования сортировки файлов и без добавления столбца длины в исходную таблицу? Или я должен просто добавить столбец длины, в этом случае, какой будет лучший способ обновления Disolution_Date каждый день год?