Могу ли я ускорить этот запрос, не сохраняя группу по порядку и по значению? - PullRequest
1 голос
/ 16 ноября 2011

У меня следующий запрос:

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 каждый день год?

1 Ответ

1 голос
/ 11 декабря 2011

То, на что вы ссылаетесь в теории баз данных, называется производным атрибутом.Вы не хотите реализовывать такой атрибут, потому что, хотя он будет работать быстро, он не очень точен.Поэтому мы не создаем столбец для такого атрибута, а вычисляем его при необходимости.

Нет необходимости сортировать файлы, это то, что делает предложение order by.

Предполагая, что вашзапрос правильный, я бы предложил создать индекс B-дерева для таблицы компании с использованием атрибутов ключа поиска (disolution_date, Inc.), поскольку они, как представляется, интенсивно используются в вашем запросе.

Не могли бы вы дать представление о компании?таблица

...