大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说MySQL 配置统计数据,希望您对编程的造诣更进一步.
什么是统计数据
MySQL 为了制定执行计划收集表的相关信息,如索引行数,索引基数(不同值的数量),占用页面数等等。这些信息被称为统计数据
。
同一条 sql 语句,在不同的数据量级下,不同的索引结构下,执行计划都是千差万别的。
而 MySQL 选定执行计划的标准就是这些统计数据。
统计数据怎么存储
两种存储方式:
1. 基于磁盘的永久性存储
2. 基于内存的非永久性存储
代码100分
默认情况下,MySQL 配置为持久化到磁盘,咱们这次也只讨论持久化到磁盘的形式,因为基于内存的形式统计的数据与其相同。
在全局变量中有两个值来标志是否是用磁盘来存储
innodb_stats_persistent
:是否使用磁盘
Innodb_stats_persistent_sample_pages
:统计数据的抽样页面数
存储形式:
可以看到有两个表存储数据统计信息:innodb_table_stats
& innodb_index_stats
存储的信息
首先来看 innodb_table_stats
中存储结构
字段含义:
字段 | 含义 |
---|---|
database_name | 数据库 |
table_name | 表名 |
last_update | 上次更新时间 |
n_rows | 表中行数 |
clustered_index_size | 聚簇索引占用的页面数 |
sum_of_other_index_sizes | 除了聚簇索引之外的其他索引站用的页面数 |
再来看一下 innodb_index_stats
中的信息
字段 | 含义 |
---|---|
database_name | 数据库 |
table_name | 表名 |
index_name | 索引名称 |
last_update | 上次更新时间 |
stat_name | 可以看到最后一列的 stat_description 中有解释这一列是什么意思 n_leaf_pages : 叶子页面的数量 size : 总页面数。值得注意的是, n_diff_pfx01 和 n_diff_pfx02 , 这两个是联合索引中前缀索引的不同部分。 |
stat_value | 统计出的数值 |
sample_size | 为了统计上一个数值用了多少个页面 |
stat_description | 对统计数据的简介 |
如何更新统计数据
这些统计数据并非是一成不变的,否则数据库的执行计划会变得特别不准确。
有两种方式来启用统计数据更新:
• 开启 innodb_stats_auto_recalc
(在页面变动超过 10%【定义值】 时,触发统计数据的计算,异步过程,不会阻塞)
• 手动调用 ANALYZE TABLE
语句来更新统计信息 (同步过程,会阻塞
请求)
NULL 值如何统计
现在一切都很正常,除了 NULL (万恶之源)
因为 NULL 有多重语义,对于基数来说,有三种解释:
1. 列中所有的 NULL 都是同一个值,记为 1
2. 忽略 NULL,记为 0
3. 每个 NULL 都算作一个不同的值,记为 N
基于这个事实,mysql 为用户提供了一个可配置的系统变量: innodb_stats_method
1. nulls_equal:对应上文 1
2. nulls_unequal:对应上文 2
3. nulls_ignored:对应上文 3
建议:最好不要在索引列中存放 NULL 值
参考文档
《MySQL 是怎样运行的:从根儿上理解 MySQL》
《MySQL 手册》
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/8924.html