开发者社区> 问答> 正文

为什么估算的行数在phpmyadmin结果中有很大不同?

没有对数据库进行任何更改,我的表上的行数却大不相同。

是什么原因造成的?

在此处输入图片说明

在此处输入图片说明

Server version: 5.1.63-cll Engine: InnoDB

展开
收起
保持可爱mmm 2020-05-11 13:48:54 582 0
1 条回答
写回答
取消 提交回答
  • 与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

    2020-05-11 13:49:05
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载