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

标签 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;

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/

相关文章:

mysql - SQL 性能 - 联合和子选择

用于更新值的 PHP 脚本无法正常工作

sql - Oracle中如何使用字符串选择表?

mysql - 如何连接三个表以获得总和

java - 链接方法调用java性能

python - 我需要根据两列数据帧生成新列,如何才能更快?

php - PHP 中月份的数值

mysql - 在一个项目中同时使用 Mongodb 和 Mysql

java - hibernate如何在session.save(object)上获取新插入的记录主键

sql - 更改行的排序顺序后如何重新排列 "sort order"列