У меня есть веб-сайт с системой голосования (нравится / не нравится).
Приложение было разработано другим разработчиком, и теперь веб-сайт становится все больше и больше, а производительность серьезно.
У меня есть следующая таблица:
CREATE TABLE `vote` (
`id` int(11) NOT NULL auto_increment,
`article_id` int(11) NOT NULL,
`token` varchar(64) collate utf8_unicode_ci NOT NULL,
`type` int(1) NOT NULL,
PRIMARY KEY (`id`),
KEY `article_id` (`article_id`)
) ENGINE=InnoDB;
Столбец токена используется для идентификации каждого пользователя / голоса / даты, когда он является уникальным токеном, который является частью отпечатка пальца пользователя, чтобы позволить им проголосовать один раз и изменить свой тип голосования.
Один из самых медленных запросов:
SELECT count(*) AS `nb` FROM `vote` WHERE (token = '00123456789012345678901234567890');
Иногда, когда сервер не выключается, возвращается почти 10 секунд.
Я не могу использовать кеш здесь, потому что мне нужно проверить в режиме реального времени, чтобы разрешить или нет голосование и увеличить счет.
Я не могу сильно изменить логику приложения, поскольку она опирается на слишком много зависимостей, используемых повсеместно в приложении (оно было плохо спроектировано).
Так что я ищу варианты улучшения, даже нескольких, производительности.
Редактировать : у меня есть индекс для столбца токена
есть ~ 2 000 000 строк и все токены почти уникальны
EDIT
Я провел тест со всеми вашими советами:
Top average queries
1. SELECT COUNT(*) AS nb FROM `vote` WHERE (`token` = '%s') completed in 2.19790604115 sec
2. SELECT COUNT(`id`) AS nb FROM `vote` WHERE (`token` = '%s') completed in 2.28792096376 sec
3. SELECT COUNT(`id`) AS nb FROM `vote` WHERE (`token` = '%s') GROUP BY `token` completed in 2.3732401371 sec
4. SELECT COUNT(*) AS nb FROM `vote` WHERE (`token` = '%s') GROUP BY `token` completed in 2.57634830475 sec
Иногда третий запрос самый быстрый, а иногда и худший.
Я запускал его 10 раз, когда каждый запрос выполнялся 20 раз
Я провел этот тест БЕЗ любых индексов (кроме одного на id
)
Это странно, хотя COUNT (id) мог бы немного ускорить запрос.