我有一个带有投票系统的网站(喜欢/不喜欢)。
该应用程序已由另一个开发人员开发,现在网站越来越大,性能正在受到重视。
我有下表:
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 行,所有令牌几乎都是唯一的
编辑:
我根据您的所有建议进行了基准测试:
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 次
我在没有任何索引的情况下运行了这个基准测试(除了一个 on id
)
这很奇怪,我虽然 COUNT(id) 会加快查询速度。