《从根上理解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值有专门的参数来决定如何处理


第二天复习

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

相关推荐
r***186440 分钟前
如何使用C#与SQL Server数据库进行交互
数据库·c#·交互
程序员皮皮林1 小时前
Redis:大数据中如何抗住2000W的QPS
大数据·数据库·redis
LO嘉嘉VE1 小时前
学习笔记二十一:深度学习
笔记·深度学习·学习
n***s9091 小时前
Redis如何设置密码
数据库·redis·缓存
y***61311 小时前
redis 使用
数据库·redis·缓存
n***78681 小时前
Redis-配置文件
数据库·redis·oracle
老年DBA1 小时前
Postgresql-使用 pg_trgm 实现高效的 LIKE / ILIKE 模糊搜索
数据库·postgresql
r***11331 小时前
如何实现Redis安装与使用的详细教程
数据库·redis·缓存
翔云1234561 小时前
MySQL中,binlog文件开头的Previous_gtids_log_event是如何计算的
数据库·mysql·adb