我有一个带有投票系统(喜欢/不喜欢)的网站。
该应用程序已由另一位开发人员开发,现在网站越来越大,性能也很重要。
我有下表:
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;
token 列用于标识每个用户/投票/日期,它是一个唯一 token ,是用户指纹的一部分,允许他们投票一次并更改他们的投票类型。
最慢的查询之一如下:
SELECT count(*) AS `nb` FROM `vote` WHERE (token = '00123456789012345678901234567890');
当服务器没有关闭时,有时需要将近 10 秒才能返回。
我不能在这里使用缓存,因为我需要实时检查以允许或不允许投票并增加计数。
我无法更改太多应用程序逻辑,因为它依赖于应用程序中随处使用的太多依赖项(设计糟糕)。
所以我正在寻找改进性能的方法,即使是一些改进。
编辑:我在 token 列上有一个索引
大约有 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 次
我运行这个基准测试时没有任何索引(id
上的索引除外)
这很奇怪,我认为 COUNT(id) 会加快查询速度。
最佳答案
如果标记列尚未编制索引,您应该考虑对其编制索引。
关于mysql - 如何提高我的投票系统的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5984355/