Предположим, что в иллюстративных целях вы используете библиотеку с использованием простой таблицы "книг" MySQL с тремя столбцами:
(id, title, status)
- id является основным ключом
- title - название книги
- статус может быть перечислением, описывающим текущее состояние книги (например, НАЛИЧИЕ, ПРОВЕРКА, ОБРАБОТКА, ОТСУТСТВИЕ)
Простой запрос, чтобы сообщить, сколько книг попадает в каждое состояние:
SELECT status, COUNT(*) FROM books GROUP BY status
или конкретно узнать, сколько книг доступно:
SELECT COUNT(*) FROM books WHERE status = "AVAILABLE"
Однако, как только таблица вырастет до миллионов строк, эти запросы занимают несколько секунд. Добавление индекса в столбец "статус" не влияет на мой опыт.
Помимо периодического кэширования результатов или явного обновления сводной информации в отдельной таблице каждый раз, когда книга меняет состояние (через триггеры или какой-либо другой механизм), существуют ли какие-либо методы для ускорения этих запросов? Кажется, что запросы COUNT в конечном итоге смотрят на каждую строку, и (не зная подробностей) я немного удивлен, что эта информация не может быть определена каким-либо образом из индекса.
UPDATE
Используя таблицу образцов (с индексированным столбцом "статус" ) с 2 миллионами строк, я сравнивал запрос GROUP BY. Используя движок хранения InnoDB, запрос занимает 3,0 - 3,2 секунды на моей машине. Используя MyISAM, запрос занимает 0,9 - 1,1 секунды. Не было существенной разницы между count (*), count (status) или count (1) в любом случае.
MyISAM, по общему признанию, немного быстрее, но мне было любопытно узнать, есть ли способ ускорить выполнение эквивалентного запроса (например, 10-50 мс - достаточно быстро, чтобы вызывать каждый запрос веб-страницы для низкоуровневого запроса, сайт трафика) без умственных накладных расходов на кеширование и триггеры. Похоже, что ответ "нет способа быстро запустить прямой запрос", что я и ожидал, - я просто хотел убедиться, что я не пропустил простой альтернативы.