如果没有对数据库进行任何更改我非常不同的行上我的表数。
这是什么原因?
Server version: 5.1.63-cll
Engine: InnoDB
如果没有对数据库进行任何更改我非常不同的行上我的表数。
这是什么原因?
Server version: 5.1.63-cll
Engine: InnoDB
不像MyISAM表,InnoDB表不跟踪表中有多少行包含的内容。
正因为如此,才知道行的一个InnoDB表的确切数量的唯一方法是检查各行中的表和累积计数。 因此,在大InnoDB表,执行SELECT COUNT(*) FROM innodb_table
查询可以,因为它执行全表扫描获得的行数很慢。
phpMyAdmin的使用就像一个查询SHOW TABLE STATUS
获得的行数的估计数从发动机(InnoDB的)表。 由于这只是一个估计,它在每次调用时间而变化,有时变化可以是相当大的,有时他们接近。
下面是关于信息的博客文章COUNT(*)InnoDB表由Percona的。
对于MySQL手册页SHOW TABLE STATUS状态:
行数。 部分存储引擎,如MyISAM,存储精确的数目。 对于其它存储引擎,例如InnoDB,该值是一个近似值,并且多达40%至50%与实际值可能有所不同。 在这种情况下,使用SELECT COUNT(*),以获得准确的数目。
在该页面的InnoDB限制进入一些细节:
SHOW TABLE STATUS不能给出关于InnoDB表准确的统计数据,除了被表保留的物理尺寸。 该行数仅用于SQL优化的粗略估计。
InnoDB的不守行的内部计数的表,因为并发事务可能会“看到”的行不同数量在同一时间。 为了处理一个
SELECT COUNT(*) FROM t
语句时,InnoDB扫描表,这需要一些时间,如果索引不是完全在缓冲池的索引。 如果您的表不经常改变,使用MySQL查询缓存是一个很好的解决方案。 要获得快速计数,你必须使用你自己创建一个计数表,让您的应用程序根据插入更新和删除它。 如果一个近似的行数是足够的,SHOW TABLE STATUS
可以使用。 参见第14.3.14.1, “InnoDB的性能优化技巧” 。
phpMyAdmin的使用快速的方法来获得的行数,而且这种方法只在InnoDB表的情况下,返回的近似数。
见$cfg['MaxExactCount']
的方式来修改这些结果,但是这可能会对性能产生严重影响。