MySQL 2.5M行缓慢计数

4

有一个简单的mysql表,其中包含id(主键)和hash(索引)。还有其他列(varchar / int),但不需要对它们进行查询。

我的总表大小约为350MB,有250万行。

SELECT COUNT(*) FROM table LIMIT 1;

讨论需要约0.5-1秒时间。我的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毫秒内返回(本地mysql)。有关改善缓慢计数(0.5-1秒)的任何提示都将不胜感激。

2个回答

1
你可以在这里找到简要解释。简而言之,innodb必须进行完整的表扫描,以计算所有行数(没有where子句,这将利用索引)。 另请参见此答案
顺便说一下,在查询中使用LIMIT 1没有任何意义。由于没有group by子句,它总是返回一条记录。

但是由于我只使用主键,它不需要使用内存,应该使用内存吧?我甚至在1GB的InnoDB缓冲区(4GB RAM机器)上进行了测试。 - Floris
“EXPLAIN”是你的好朋友。在语句中使用“EXPLAIN SELECT…”并验证是否使用了索引。如果没有,你可以通过“SELECT COUNT(id) FROM table USE INDEX (PRIMARY)”强制使用索引。 - Tasos P.

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接