mysql 2.5M行慢计数

时间:2013-11-06 17:20:50

标签: mysql sql database performance database-performance

使用id(主键)和hash(索引)的简单mysql表。其他一些列(varchar / int)但不需要对它们进行查询。

我的总表大小约为350MB,行数为2.5M。

SELECT COUNT(*) FROM table LIMIT 1;

大约需要0.5 - 1s。我的innodb缓冲区设置为1GB。我也尝试了变化(没有改进),如:

SELECT COUNT(id) FROM table LIMIT 1;

SELECT COUNT(*) FROM table WHERE id > 0 LIMIT 1;

单个

SELECT * FROM table WHERE id = 'x' LIMIT 1;

将在1 ms内返回(localhost mysql)。任何有关改善慢速计数(0.5 - 1s)的提示都将不胜感激。

2 个答案:

答案 0 :(得分:1)

前段时间我发现,MyISAM表可以让这些操作更快。但并非所有表格和架构都可以是MyISAM。检查您的架构,也许您可​​以将此表切换到MyISAM。

同时使用COUNT(1)代替COUNT(*)

另一种技巧适合你。在分开的位置创建触发器并保存计数。创建counter_table并按下触发器:

DELIMITER //

CREATE TRIGGER update_counter AFTER INSERT ON table_name
FOR EACH ROW
BEGIN
    UPDATE counter_table
    SET counter = counter + 1
END;

答案 1 :(得分:1)

你可以找到一个简单的解释here。简而言之,innodb必须进行全表扫描才能计算所有行(没有where子句,这将使用索引)。 另请参阅this answer

顺便说一句,我在查询中使用LIMIT 1时看不到任何意义。由于没有group by子句,它将始终返回一条记录。