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)会加快查询速度.