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

表的统计数据:SHOW TABLE STATUS LIKE 'table_name';

索引的统计数据:SHOW INDEX FROM table_name;

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

InnoDB 提供了两种存储统计数据的方式:

  1. 永久性的统计数据。存储在磁盘上,服务器重启之后还在。
  2. 非永久性的统计数据。存储在内存中,随服务器关闭而清除,服务器重启时可以重新收集。

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

当我们选择把某个表以及该表索引的统计数据存放到磁盘上时,实际上是把这些统计数据存储到了两个表里:

SHOW TABLES FROM mysql LIKE 'innodb%';

在这里插入图片描述

  1. innodb_table_stats:存储了关于表的统计数据,每一条记录对应着一个表的统计数据。
  2. innodb_index_stats:存储了关于索引的统计数据,每一条记录对应着一个索引的一个统计项的统计数据。
13.2.1 innodb_table_stats
SELECT * FROM mysql.innodb_table_stats;

在这里插入图片描述

字段名描述
database_name库名
table_name表名
last_update本条记录最后更新时间
n_rows表中记录数(估计值)
clustered_index_size表的聚簇索引占用的页面数量(估计值)
sum_of_other_index_sizes表的其他索引占用的页面数量(估计值)
13.2.1.1 n_rows 统计项的收集

按照一定算法(并不是纯粹随机)选取几个叶子节点页面,计算每个页面中主键值的记录数量,计算平均数后×全部叶子节点数量 = n_rows,所以是一个估计值。

13.2.1.2 clustered_index_size 和 sum_of_other_index_sizes
  1. 从数据字典里找到表的各个索引对应的根页面位置
  2. 从根页面的 Page Header 里找到叶子节点段和非叶子节点段对应的 Segemnt Header
  3. 从叶子节点段和非叶子节点段的 Segemnt Header 中找到这两个段对应的 INODE Entry 结构
  4. 从对应的 INODE Entry 结构中找到该段对应所有零散的页面地址以及 FREE、NOT_FULL 和 FULL 链表的基节点
  5. 直接统计零散的页面有多少个,然后从那三个链表的 List Length 字段中读出该段占用的区的大小,每个区占用64个页,所以就可以统计出整个段占用的页面
  6. 分别计算聚簇索引和其余索引
13.2.2 innodb_index_stats
SELECT * FROM mysql.innodb_index_stats WHERE table_name = 'single_table';

在这里插入图片描述

字段名描述
database_name库名
table_name表名
index_name索引名
last_udpate本条记录最后更新时间
stat_name统计项的名称
stat_value统计项的值
sample_size为生成统计数据而采样的页面数量
stat_description统计项的描述
统计项描述
n_leaf_pages索引的叶子节点占用多少页面
size索引共占用多少页面
n_diff_pfxNN索引列不重复的值有多少
13.2.3 定期更新统计数据
  1. 开启 innodb_stat_auto_recalc
  2. 手动调用 ANALYZE TABLE 语句
13.2.4 手动更新 innodb_table_stats 和 innodb_index_stats 表
UPDATE innodb_table_stats
SET n_rows = 1
WHERE table_name = 'single_table';
FLUSH TABLE single_table;

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

新版本 MySQL 不用

13.4 innodb_stats_method 的使用

计算某个索引列不重复值的数量时如何对待 NULL 值,有三个候选值:

  1. nulls_equals:认为所有 NULL 值都是相等的。默认值
  2. nuls_unequals:认为所有 NULL 都是不相等的。
  3. nulls_ignored:直接把 NULL 值忽略掉。

13.5 总结

InnoDB 以表为单位来收集统计数据,可以是基于磁盘的永久性数据,也可以是基于内存的非永久性数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1535743.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

上图为是否色发

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

利士策分享,深耕一事:解锁专注秘诀

利士策分享,深耕一事:解锁专注秘诀 在信息洪流与诱惑交织的时代,专注成为稀缺能力。 我们常被社交媒体、工作邮件和琐事分散注意力,难以集中。 然而,专注是实现个人成长、职业发展和生活目标的基石。 要提升专注力&…

SSM网上书店管理系统---附源码72542

目 录 摘要 1 绪论 1.1 研究背景及意义 1.2国内外研究现状 1.3系统开发的目标 1.4论文结构与章节安排 2 网上书店管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非…

Docker安装mysql安装nginx安装Redis

Docker安装mysql 下载镜像 docker pull mysql:8.0注意,使用此方法安装镜像需要提前配置镜像源,详情看之前的文章 安装 docker run -d -p 3306:3306 \ --name mysql \ --restartalways \ --privilegedtrue \ -e TZAsia/Shanghai \ -e MYSQL_ROOT_PASSWORDroot \ mysql:8.0进…

【漏洞复现】用友 U8-cloud ActionServlet sql注入漏洞

产品介绍 用友U8 CRM客户关系管理系统是一款专业的企业级CRM软件,旨在帮助企业高效管理客户关系、提升销售业绩和提供优质的客户服务。 漏洞描述 用友 U8-cloud ActionServlet 接口存在一个 SQL 注入漏洞,通过这个漏洞可以操纵服务器的数据库。这意味…

Protubuf入门

⼀、初识 ProtoBuf 1. 序列化概念 序列化和反序列化 序列化:把对象转换为字节序列的过程 称为对象的序列化。 反序列化:把字节序列恢复为对象的过程 称为对象的反序列化。 什么情况下需要序列化 存储数据:当你想把的内存中的对象状态…

AtCoder ABC369 A-D题解

比赛链接:ABC369 省流&#xff1a;A<B<D<C&#xff08;题解是按照该顺序写的&#xff09; Problem A: #include <bist/stdc.h> using namespace std; int main(){int A,B;cin>>A>>B;if(AB)cout<<1<<endl;else if(abs(A-B)%20)cout&l…

基于Web的《药谷奇遇记》网站设计与实现---附源码72940

目 录 1 绪论 1.1 研究背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2 系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 系统流程…

【Qt绘图】—— 运用Qt进行绘图

目录 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;绘制各种形状 2.1 绘制线段 2.2 绘制矩形 2.3 绘制圆形 2.4 绘制文本 2.5 设置画笔 2.6 设置画刷 &#xff08;三&#xff09;绘制图片 3.1 绘制简单图片 3.2 平移图片 3.3 缩放图片 3.4…

TCP客户端编码和解码处理:发送和接收指定编码消息

文章目录 引言基于Netty实现TCP客户端Netty发送GBK编码指令Netty接收GBK编码基于Channel发送指令基于ChannelHandlerContext发送指令:建立连接时发送登陆指令开启日志,查看报文信息基于ChannelInboundHandlerAdapter进行业务逻辑处理原生API实现TCP客户端基于DataOutputStrea…

C++入门 之 类和对象(上)

目录 一、类的定义 1.类定义格式 2.访问限定符 3.类域 二、实例化 1.实例化概念 2.对象大小 3.this指针 一、类的定义 1.类定义格式 1、class Stack{}&#xff1b;class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义…

Vue3.0组合式API:computed计算属性、watch监听器、watchEffect高级监听器

1、computed() 计算属性 在模板中绑定表达式只能用于简单的运算。如果运算比较复杂&#xff0c;可以使用 Vue.js 提供的计算属性&#xff0c;通过计算属性可以处理比较复杂的逻辑。 1.1 计算属性的应用 通过计算属性可以实现各种复杂的逻辑&#xff0c;包括运算、函数调用等…

【自然语言处理】实验三:新冠病毒的FAQ问答系统

目录 前言 1.新建data_process.py 1.1导入包并定义功能模块1用来读取问题和答案FAQ的文件 1.2功能模块2&#xff1a;进行问题/问题列表处理&#xff08;正则化&#xff0c;分词&#xff09; 1.3功能模块3&#xff1a;处理输入的问题 1.4功能模块4&#xff1a;计算输入问题与问题…

Python | Leetcode Python题解之第405题数字转换为十六进制数

题目&#xff1a; 题解&#xff1a; CONV "0123456789abcdef" class Solution:def toHex(self, num: int) -> str:ans []# 32位2进制数&#xff0c;转换成16进制 -> 4个一组&#xff0c;一共八组for _ in range(8):ans.append(num%16)num // 16if not num:b…

Python实用的27个实例,涵盖从基础到进阶的所有领域!

Python 是一种广泛使用的高级编程语言&#xff0c;以其简洁的语法和丰富的库支持而受到开发者们的喜爱。以下列出了 27 个实用的 Python 实例&#xff0c;涵盖从基础到进阶的不同领域&#xff0c;帮助你提升编程技能。 1. 打印 "Hello, World!" print("Hello,…

预训练发展

预训练发展 1.ELMo2.GPT3.Bert3.1Ernie-baidu3.2Ernie- Tsinghua 4.GPT25.UNILM6.Transformer-XL & XLNet6.1方案一6.2方案三 7.Roberta8.SpanBert8.1SBO简介&#xff1a; 9.ALBERT9.1方案一9.2方案二9.3方案三 10.T511.GPT312.从"续写"到"回答"12.1SF…

可解释性机器学习中的局部解释

可解释性机器学习可以被分成两大类&#xff0c;第一大类叫做局部的解释&#xff0c;第二大类叫做全局的 解释&#xff0c;如图 1 所示。局部的解释是&#xff0c;比如有一个图像分类器&#xff0c;输入一张图片&#xff0c;它会判断出 是一只猫&#xff0c;机器要回答问题是为什…

浅谈Spring Cloud:认识微服务

SpringCloud就是分布式微服务架构的一站式解决方案&#xff0c;是微服务架构落地的多种技术的集合。 目录 微服务远程调用 Eureka注册中心 搭建Eureka Server 注册组件 服务拉取 当各种各样的服务越来越多&#xff0c;拆分的也越来越细&#xff0c;此时就会出现一个服务集…

速通GPT:《Improving Language Understanding by Generative Pre-Training》全文解读

文章目录 速通GPT系列几个重要概念1、微调的具体做法2、任务感知输入变换3、判别式训练模型 Abstract概括分析和观点1. 自然语言理解中的数据问题2. 生成预训练和监督微调的结合3. 任务感知输入变换4. 模型的强大性能 Introduction概括分析和观点1. 自然语言理解的挑战在于对标…

Android源码导入Android Studio

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 前言 需要先把 Android 源码编译一遍 然后执行下面指令就可以导入android源码了 关于 Android 源码编译可以参考这篇文章【LineageOS源码下载和编译&#xf…