没有对数据库进行任何更改,我的表上的行数却大不相同。
是什么原因造成的?
在此处输入图片说明
在此处输入图片说明
Server version: 5.1.63-cll Engine: InnoDB
与MyISAM表不同,InnoDB表不会跟踪该表包含多少行。
因此,知道InnoDB表中确切行数的唯一方法是检查表中的每一行并累加一个计数。因此,在大型InnoDB表上,执行SELECT COUNT(*) FROM innodb_table查询的速度可能非常慢,因为它会进行全表扫描以获取行数。
phpMyAdmin使用查询SHOW TABLE STATUS来从引擎(InnoDB)获取表中行数的估计计数。由于这只是估计,因此每次您调用它时都会有所不同,有时差异可能会很大,有时甚至很接近。
这是Percona 关于InnoDB表的COUNT(*)的内容丰富的博客文章。
显示表状态的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性能调优技巧”。来源:stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。