第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值有专门的参数来决定如何处理
第二天复习
这个数据的统计并不是数据库功能的核心啊,这里我们稍做了解即可