如何提高我的投票系统的性能?

Joh*_*hnT 1 mysql sql performance voting-system

我有一个投票系统的网站(喜欢/不喜欢).

该应用程序是由另一个开发人员开发的,现在网站越来越大,性能得到认真考虑.

我有下表:

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;
Run Code Online (Sandbox Code Playgroud)

令牌列用于标识每个用户/投票/日期,它是一个唯一令牌,它是用户指纹的一部分,允许他们投票一次并更改其投票类型.

最慢的查询之一是以下内容:

SELECT count(*) AS `nb` FROM `vote` WHERE (token = '00123456789012345678901234567890');
Run Code Online (Sandbox Code Playgroud)

当服务器没有关闭时,有时需要几乎10秒的时间才能返回.

我不能在这里使用缓存,因为我需要实时检查是否允许投票并增加计数.

我无法改变太多的应用程序逻辑,因为它依赖于应用程序中任何地方使用的太多依赖项(它设计得很糟糕).

所以我正在寻找改进甚至一些性能的选项.

编辑:我在令牌列上有一个索引

有大约2,000,000行,所有令牌几乎都是唯一的


编辑:

我提出了所有建议的基准:

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 
Run Code Online (Sandbox Code Playgroud)

有时第三个查询是最快的,但有时它是最差的.

我运行了10次,每次查询运行20次

我在没有任何INDEXES的情况下运行此基准测试(除了一个id)

这很奇怪,我虽然COUNT(id)会加快查询速度.

Jer*_*ose 6

如果标记列尚未编入索引,则应该查看标记列的索引.