4

有一个带有id(主键)和hash(索引)的简单 mysql 表。其他一些列(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 毫秒内返回(localhost mysql)。任何改善慢计数(0.5 - 1s)的技巧将不胜感激。

4

2 回答 2

1

您可以在此处找到简要说明。简而言之,innodb 必须进行全表扫描才能计算所有行(没有 where 子句,它会利用索引)。另请参阅此答案

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

于 2013-11-06T17:36:33.323 回答
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;
于 2013-11-06T17:33:01.033 回答