2012-08-12 70 views

回答

37

不像MyISAM表,InnoDB表不跟踪表中有多少行包含的内容。

因此,要知道InnoDB表中的确切行数的唯一方法是检查表中的每一行并累积一个计数。因此,对于大型InnoDB表,执行SELECT COUNT(*) FROM innodb_table查询可能会非常缓慢,因为它会执行全表扫描以获取行数。

phpMyAdmin使用类似SHOW TABLE STATUS的查询来获取引擎(InnoDB)表中行数的估计数。由于这只是一个估算,因此每次调用时都会有所不同,有时这些变化可能相当大,有时甚至很接近。

这是一篇关于由Percona提供的COUNT(*) for InnoDB tables的博客文章。

MySQL手册页SHOW TABLE STATUS状态:

的行数。一些存储引擎(例如MyISAM)存储了精确计数 。对于其他存储引擎,如InnoDB,这个值近似为 ,并且可能与实际值相差多达40%到50%。在这种情况下,请使用SELECT COUNT(*)计算精确的 。

的页面上InnoDB restrictions进入一些细节:

SHOW TABLE STATUS不能在InnoDB表给出准确的统计数据,除了被表保留的物理尺寸。行数只是SQL优化中使用的粗略估计。

InnoDB的不守行的内部计数的表,因为 并发事务可能会“看到”的行不同数量的 同一时间。要处理SELECT COUNT(*) FROM t语句,InnoDB会扫描 表的索引,如果索引完全位于缓冲池中,则需要一些时间。如果你的表不经常改变,使用MySQL查询缓存的 是一个很好的解决方案。要获得快速计数,您必须使用自己创建的计数器表,并让您的应用根据插入操作对其进行更新,并删除它。如果 近似行数足够,SHOW TABLE STATUS可以使用。 参见第14.3.14.1,“InnoDB Performance Tuning Tips”

+7

等待重要的一点是** SHOW TABLE STATUS是如何执行其估计的? – Pacerier 2015-04-09 14:49:44

4

phpMyAdmin使用快速方法获取行数,并且此方法仅在InnoDB表中返回近似计数。

请参阅$cfg['MaxExactCount']以修改这些结果,但这可能会对性能造成严重影响。

相关问题