《从根上理解MySQL是怎样运行的》第十三章笔记

第13章 兵马未动,粮草先行-InnoDB统计数据是如何收集的

查询成本的时候经常使用一些统计数据,统计数据是以什么方式收集来的呢?


两种不同的统计数据的存储方式

(1)永久性:存储在磁盘上的

(2)非永久性:存储在内存上的

可以指定相关的系统变量来选择使用哪种方式来存储,一般默认是存储在磁盘上的


基于磁盘的永久性的统计数据

存储的时候是将统计数据存储到表中的:


innodb-table-stats介绍

直接看下哪些列吧:

N-rows是估计值:InnoDB中按照一定的算法选取几个叶子节点页面,计算该节点中页中的记录数,然后这几个页记录数的平均数乘以所有叶子节点的数量就是该表的n-rows的值

个人思考:感觉就像是抽样调查,通过样本估计总体的个数量


Clusterted-index-size 和 sum-of-other-index-sizes统计项的收集

聚簇索引和其他索引的统计

这个统计数据的过程如下:

(1)从字典数据中找出各个索引的根页面的位置:

就是从表中之表中查询所有索引的老家在哪里

(2)从根页面的Page Header中找到叶子节点和非叶子节点的段Segment Header(段头部信息)

(3)然后再从这些Segment Header字段中找到对应的INODE Entry结构

(4)从这个结构中找到对应所有零散的页面地址以及FREE、NOT-FULL、FULL链表的基节点

然后你有了这个链表就可以开始统计数据了

小总结:字典数据 -》 两种节点对应段的信息 -〉 然后再从这些字段中找到对应的段结构 -》 最后得到主要的从属于段段三个链表的位置 -〉 数据统计

其实统计的着手点还是从管理页面的链表开始的,这下就好理解了:统计的过程主要就是重新寻找管理页面的链表的过程 + 统计


innodb-index-stats页介绍

看看各个列:

Index-name:说明记录是来自哪个索引的

Stat-name:统计同一个索引的各种值:叶节点占用页数,索引占用总页数

总之是各种统计的信息都在这上面


定期更新统计数据

统计数据更新的方式:

(1)innodb-stats-auto-recalc

自动重新统计数据:修改的记录数超过10%则自动重新统计(延迟异步统计)。InnoDB默认是以表来收集和存储统计数据的,搜易可以单独为某个表设置这个参数

(2)手动更新:手动调用ANALYZE TABLE来执行更新,这个就没什么好说的


基于内存的非永久统计数据:

这个很复杂,就不了解了哈哈哈💦


总结

InnoDB将统计数据存储到表中,可以是永久也可以是非永久的

通过各种参数可以指定使用哪种类型的统计数据

针对不同的表可以自定义相关数据统计属性

对于表中的NULL值有专门的参数来决定如何处理


第二天复习

这个数据的统计并不是数据库功能的核心啊,这里我们稍做了解即可

相关推荐
NineData20 分钟前
NineData 迁移评估功能正式上线
数据库·dba
tingshuo291736 分钟前
S001 【模板】从前缀函数到KMP应用 字符串匹配 字符串周期
笔记
NineData6 小时前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师8 小时前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
全栈老石12 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
倔强的石头_1 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou643 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
于眠牧北3 天前
MySQL的锁类型,表锁,行锁,MVCC中所使用的临键锁
mysql
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
Turnip12024 天前
深度解析:为什么简单的数据库"写操作"会在 MySQL 中卡住?
后端·mysql