昨天,微信群里有一个网友问了这个问题:“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、决策树、卡方、欠拟合和过拟合、线性代数、向量空间模型、文本检索、文本聚类、矩阵、协同过滤推荐、线性回归、高斯消元求解线性方程组、最小二乘法进行直线拟合、协方差矩阵来降维、挖掘潜在的语义关系、缓存系统的哈希表和队列实现、打造简单的搜索引擎、电商平台的搜索结果更相关、推荐系统的相似度的协同过滤、推荐系统的分析用户和物品的矩阵、综合应用个性化用户画像、反码和补码、位操作的应用实例、程序员的数学书等内容。
现在如果你想学,那么就扫描上方二维码购买,拼团成功后,加微信ID:xttblog,返现24!
: » EXPLAIN 和 SHOW TABLE STATUS LIKE 里返回的 rows 为什么不准确?
原创文章,作者:bd101bd101,如若转载,请注明出处:https://blog.ytso.com/252429.html