Ускорение подсчета строк в MySQL

Предположим, в иллюстративных целях вы запускаете библиотеку, используя простой MySQL "книги» таблица с тремя столбцами:

(идентификатор, название, статус)

Я бы это первичный ключзаглавие это название книгистатус может быть перечисление, описывающее книгутекущее состояние (например, ДОСТУПНО, ПРОВЕРЕНО, ОБРАБОТАНО, ОТСУТСТВУЕТ)

Простой запрос, чтобы сообщить, сколько книг попадает в каждый штат:

SELECT status, COUNT(*) FROM books GROUP BY status

или специально определить, сколько книг доступно:

SELECT COUNT(*) FROM books WHERE status = "AVAILABLE"

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

Помимо периодического кэширования результатов или явного обновления сводной информации в отдельной таблице каждый раз, когда книга меняет состояние (с помощью триггеров или другого механизма), существуют ли какие-либо методы для ускорения таких запросов? Кажется, что запросы COUNT заканчиваются просмотром каждой строки, и (не зная больше деталей) я 'Я немного удивлен, что эта информация можетКак-то определяется из индекса.

ОБНОВИТЬ

Использование таблицы примеров (с индексированием "статус" столбец) с 2 миллионами строк, я сравнил запрос GROUP BY. Используя механизм хранения InnoDB, запрос занимает 3,0 - 3,2 секунды на моем компьютере. Используя MyISAM, запрос занимает 0,9 - 1,1 секунды. В обоих случаях не было существенной разницы между количеством (*), количеством (статусом) или количеством (1).

MyISAM по общему признанию немного быстрее, но мне было любопытно посмотреть, был ли способ выполнить эквивалентный запросмного быстрее (например, 10-50 мс - достаточно быстро, чтобы вызываться при каждом запросе веб-страницы для сайта с небольшим трафиком) без лишних затрат на кэширование и триггеры. Похоже, ответ "там'нет способа быстро выполнить прямой запрос " что я и ожидал - я просто хотел убедиться, что я неНе упускаю простой альтернативы.

Ответы на вопрос(5)

Ваш ответ на вопрос