EXPLAIN 和 SHOW TABLE STATUS LIKE 里返回的 rows 为什么不准确?_java

昨天,微信群里有一个网友问了这个问题:“SHOW TABLE STATUS LIKE 里返回的 rows 为什么不是准确的啊 ?”

今天,我就抽个时间简单的说一下!如果有错误的地方,请大家评论里留言指正!

首先,我们根据字面意思来看,rows 代表的行数。准确的说是受影响的行数,或者说是扫描的行数!

从理论上来说,我实际查询扫描了多少行数,应该是准确的。但是这里显示不准确,MySQL 统计的不准确,是 MySQL 故意这样设计的吗?如果是,那为什么要这样设计?

显然,不准确的这件事,MySQL 是知道的。那么它这样设计一定是有原因的。

我们都知道,MySQL 有一个优化器,它会对你的 SQL 进行一些优化。优化器的原理就是在真正执行 SQL 之前来估算一些每种执行策略的代价,选择一种它认为最好的方案去执行!

由于,优化器是在真正执行前做出的判断,所以它不可能是准确的。优化器,只能根据索引的“区分度”来统计、估算要扫描的行数。

在这里,MySQL 为了操作数据更高效。利用数学知识,做了一个抽样统计。

抽样,就是 InnoDB 默认会选择 N 个数据页,统计这些页面上的不同值,得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数。

以上也就解释了为什么 EXPLAIN 和 SHOW TABLE STATUS LIKE 里返回的 rows 不准确!

下面是一个活动。由于昨天的那篇文章中,有人反馈二维码被遮挡了,所以,今天再把二维码发出来!

其实,除了上面我解释的 MySQL 采样统计用到了数学外,操作系统,人工智能,机器学习,各种算法,数据结构等都离不开数学。更准确的说,编程就离不开数学。下面的这些数据结构就更离不数学了。

EXPLAIN 和 SHOW TABLE STATUS LIKE 里返回的 rows 为什么不准确?_java_02这张图是极客时间《程序员的数学基础课》这个专栏中列举的内容。