Java基础、中级、高级、架构面试资料

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

SQL herman 3086浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

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

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

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

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

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

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

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

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

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

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

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

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

程序员的数学应用地图

这张图是极客时间《程序员的数学基础课》这个专栏中列举的内容。

这个专栏中还包含:二进制转化、计算机的除法取模和取余、哈希函数、计算平方根、归并排序、MapReduce、不重复排列、全排列、世界杯的赛程安排、距离的查询推荐、状态转移方程编程实现、树的深度优先搜索、广度优先搜索、人际关系的六度理论、双向广度优先搜索、计算机看地图、时间和空间复杂度、数组、链表、队列、栈、SQL的各种连接查询、概率和统计、随机数、贝叶斯法则、区分特定类型的新闻、计算机自动处理分类、语音识别、信息熵、PageRank、决策树、卡方、欠拟合和过拟合、线性代数、向量空间模型、文本检索、文本聚类、矩阵、协同过滤推荐、线性回归、高斯消元求解线性方程组、最小二乘法进行直线拟合、协方差矩阵来降维、挖掘潜在的语义关系、缓存系统的哈希表和队列实现、打造简单的搜索引擎、电商平台的搜索结果更相关、推荐系统的相似度的协同过滤、推荐系统的分析用户和物品的矩阵、综合应用个性化用户画像、反码和补码、位操作的应用实例、程序员的数学书等内容。

扫码拼团购买成功后,加微信xttblog,返现24

现在如果你想学,那么就扫描上方二维码购买,拼团成功后,加微信ID:xttblog,返现24!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » EXPLAIN 和 SHOW TABLE STATUS LIKE 里返回的 rows 为什么不准确?