2011-07-14 41 views
14

如何最有效地计算大表中的总行数?我有23万行的表和下面的查询需要对生产硬件30+秒:MySQL:如何高效地计算大表中的行数?

select count(*) from tablename; 

看来,MySQL必须做一个表扫描,但它似乎并不像这应该是必要的。

+0

你有一个主键?桌上有什么指标? –

+0

@Jacob,真的很重要吗?如果InnoDb存在,InnoDb将不得不计数23mi的PK或索引。 – Tocco

+0

它可能在做索引扫描,但它仍然会很慢。 –

回答

3

InnoDB中一个表的行数很慢。

另一方面,MyISAM将行计数作为表的属性,这使得您的查询在MyISAM上非常快速。

+0

对于MyISAM来说+1,有时InnoDB并不会削减它:P –

+1

这就是您在InnoDB中为遵守ACID付出的代价。 – Mchl

14

如果一个近似是不够的,你可以使用:

show table status like 'tablename' 
+0

从,不喜欢:) – Karolis

+2

@Karolis:没有。它是SHOW TABLE STATUS [FROM数据库] [LIKE'pattern']。 – wonk0

+0

@ wonk0是的。你是对的。 – Karolis

0

使用缓存查询SELECT SQL_CACHE数(列)从表

+0

查询缓存自MySQL 5.7.20起弃用,并在MySQL 8.0中删除。 – DidThis

相关问题