在没有对数据库进行任何更改的情况下,我的表上的行数非常不同.
是什么导致这个?
Server version: 5.1.63-cll
Engine: InnoDB
Run Code Online (Sandbox Code Playgroud)
dre*_*010 48
与MyISAM表不同,InnoDB表不跟踪表包含的行数.
因此,了解InnoDB表中确切行数的唯一方法是检查表中的每一行并累积计数.因此,在大型InnoDB表上,执行SELECT COUNT(*) FROM innodb_table
查询可能会非常慢,因为它会执行全表扫描以获取行数.
phpMyAdmin使用一个查询SHOW TABLE STATUS
来获取引擎(InnoDB)中表中行数的估计计数.由于它只是一个估计值,因此每次调用它时都会有所不同,有时变化可能相当大,有时它们很接近.
以下是Percona 关于InnoDB表的COUNT(*)的信息博客文章.
SHOW TABLE STATUS的MySQL手册页指出:
行数.某些存储引擎(如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性能调整技巧".
归档时间: |
|
查看次数: |
15230 次 |
最近记录: |