首页 > 其他分享 >innodb中统计数据是如何收集的

innodb中统计数据是如何收集的

时间:2022-11-21 13:36:41浏览次数:49  
标签:index stats 收集 统计数据 索引 innodb 页面


InnoDB 统计数据如何查看

    1. 通过SHOW TABLE STATUS可以看到关于表的统计数据

    2. 通过SHOW INDEX可以看到关于索引的统计数据

 

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

    1. 永久性的统计数据:这种统计数据存储在磁盘上,也就是服务器重启之后这些统计数据还在。

    2. 非永久性的统计数据:这种统计数据存储在内存中,当服务器关闭时这些这些统计数据就都被清除掉了,等到服务器重启之后,在某些适当的场景下才会重新收集这些统计数据。

    3. 通过innodb_stats_persistent来决定是采用哪种方式存储统计数据,在5.6.6之前默认是OFF--即存储到内存,后来默认存储到磁盘

    4. 以表为单位来收集和存储统计数据的,即一些表的相关统计信息可以到内存,另外一些可以到磁盘。

    5. 创建表的时候指定属性STATS_PERSISTENT,等于1代表到磁盘 等于0代表到内存,未指定则采用innodb_stats_persistent

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

1. 存储索引和表的统计数据的系统表分别是:innodb_index_stats  和innodb_table_stats

 

2. innodb_table_stats

包含的属性

database_name   数据库名
table_name  表名
last_update 本条记录最后更新时间
n_rows  表中记录的条数
clustered_index_size    表的聚簇索引占用的页面数量
sum_of_other_index_sizes    表的其他索引占用的页面数量

 

n_rows统计项的收集

1. 按照一定算法(并不是纯粹随机的)选取几个叶子节点页面,计算每个页面中主键值记录数量

2. 然后计算平均一个页面中主键值的记录数量乘以全部叶子节点的数量就算是该表的n_rows值。

3. 通过innodb_stats_persistent_sample_pages可以控制采样的页面数量--默认是20

4. 可以在创建表的时候指定STATS_SAMPLE_PAGES来决定不同的表计算nrows的页面数量。没有指定的话就用innodb_stats_persistent_sample_pages作为默认值

 

clustered_index_size和sum_of_other_index_sizes统计项的收集

1. 从数据字典里找到表的各个索引对应的根页面位置,系统表SYS_INDEXES里存储了各个索引对应的根页面信息。

2. 从根页面的Page Header里找到叶子节点段和非叶子节点段对应的Segment Header。
-在每个索引的根页面的Page Header部分都有两个字段:PAGE_BTR_SEG_LEAF:表示B+树叶子段的Segment Header信息。
PAGE_BTR_SEG_TOP:表示B+树非叶子段的Segment Header信息。

3. 从叶子节点段和非叶子节点段的Segment Header中找到这两个段对应的INODE Entry结构。

4. 从对应的INODE Entry结构中可以找到该段对应所有零散的页面地址以及FREE、NOT_FULL、FULL链表的基节点

5. 直接统计零散的页面有多少个,然后从那三个链表的List Length字段中读出该段占用的区的大小,每个区占用64个页,所以就可以统计出整个段占用的页面

6. 分别计算聚簇索引的叶子节点段和非叶子节点段占用的页面数,它们的和就是clustered_index_size的值

7. 按照同样的套路把其余索引占用的页面数都算出来,加起来之后就是sum_of_other_index_sizes的值

8. 我们说一个段的数据在非常多时(超过32个页面),会以区为单位来申请空间,这里头的问题是以区为单位申请空间中有一些页可能并没有使用,但是在统计clustered_index_size和sum_of_other_index_sizes时都把它们算进去了,所以说聚簇索引和其他的索引占用的页面数可能比这两个值要小一些。

 

3. innodb_index_stats

包含的属性

database_name   数据库名
table_name  表名
index_name  索引名
last_update 本条记录最后更新时间
stat_name   统计项的名称
stat_value  对应的统计项的值
sample_size 为生成统计数据而采样的页面数量
stat_description    对应的统计项的描述

 

stat_name的类型

1. n_leaf_pages:表示该索引的叶子节点占用多少页面。

2. size:表示该索引共占用多少页面。

3. n_diff_pfxNN:表示对应的索引列不重复的值有多少

n_diff_pfx01表示的是统计key_part1这单单一个列不重复的值有多少。
n_diff_pfx02表示的是统计key_part1、key_part2这两个列组合起来不重复的值有多少。
n_diff_pfx03表示的是统计key_part1、key_part2、key_part3这三个列组合起来不重复的值有多少。
类似01代表索引列只有一个,02则代表2个,后面依次如此,对于非主键或者非唯一索引,他们的n_diff_pfxNN 不仅仅包含索引列本身,还需要再加上主键。

4. 在计算某些索引列中包含多少不重复值时,需要对一些叶子节点页面进行采样,size列就表明了采样的页面数量是多少。

5. 对于有多个列的联合索引来说,采样的页面数量是:innodb_stats_persistent_sample_pages × 索引列的个数

6. 当需要采样的页面数量大于该索引的叶子节点数量的话,就直接采用全表扫描来统计索引列的不重复值数量了

 

定期更新统计数据

1. innodb_table_stats和innodb_index_stats表更新的方式:

2. innodb_stats_auto_recalc:决定着服务器是否自动重新计算统计数据,它的默认值是ON,如果发生变动的记录数量超过了表大小的10%,并且自动重新计算统计数据的功能是打开的

3. STATS_AUTO_RECALC参数可以指定某个表是否采用这种方式。

4. 手动调用ANALYZE TABLE语句来更新统计信息,如果是innodb_stats_auto_recalc是OFF的情况,可以手动。该操作是同步的比较损耗性能。

 

让修改的统计数据生效

1. 首先通过update修改统计表

2. 然后调用FLUSH TABLE table_name 这个tablename是我们统计的table,而不是统计表

 

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

1.与永久性的统计数据不同,非永久性的统计数据采样的页面数量是由innodb_stats_transient_sample_pages控制的,这个系统变量的默认值是8

2.所以导致MySQL查询优化器计算查询成本的时候依赖的是经常变化的统计数据,也就会生成经常变化的执行计划

innodb_stats_method

1.我们知道索引列不重复的值的数量这个统计数据对于MySQL查询优化器十分重要,因为通过它可以计算出在索引列中平均一个值重复多少行

2.通过重复多少行可以应用到单表查询中单点区间太多,SELECT * FROM tbl_name WHERE key IN ('xx1', 'xx2', ..., 'xxn');所以直接依赖统计数据中的平均一个值重复多少行来计算单点区间对应的记录数量。

3.连接查询时,如果有涉及两个表的等值匹配连接条件,该连接条件对应的被驱动表中的列又拥有索引时,则可以使用ref访问方法来对被驱动表进行查询

4.通过innodb_stats_method 来可以设置对于列值为NULL的处理

当结果为nulls_equal:认为所有NULL值都是相等的。这个值也是innodb_stats_method的默认值
如果某个索引列中NULL值特别多的话,这种统计方式会让优化器认为某个列中平均一个值重复次数特别多,所以倾向于不使用索引进行访问。
nulls_unequal:认为所有NULL值都是不相等的。如果某个索引列中NULL值特别多的话,这种统计方式会让优化器认为某个列中平均一个值重复次数特别少,所以倾向于使用索引进行访问。
nulls_ignored:直接把NULL值忽略掉。

5.最好不在索引列中存放NULL值才是正解。

 

标签:index,stats,收集,统计数据,索引,innodb,页面
From: https://blog.51cto.com/u_6353447/5873664

相关文章

  • innodb中内存管理机制BufferPool
    ​内存结构 InnoDB主索引是聚簇索引,索引与数据共用表空间,对于InnoDB而言,数据就是索引,索引就是数据。InnoDB缓存机制和MyISAM缓存机制的最大区别就是在于,InnoDB不仅仅是缓存......
  • InnoDB体系结构及工作原理
    概念InnoDB主要包括了内存池、后台线程以及存储文件。INNODB的三大特性:插入缓存,两次写,自适应hash内存池又是由多个内存块组成的,主要包括BufferPool、redolog缓冲等,解决cpu......
  • original: Error: Unknown storage engine 'InnoDB'
    问题Nodejs工程下,用sequelize向一个现有的MySQL数据库中初始化数据时报错,如题:original:Error:Unknownstorageengine'InnoDB'ENVMySQL5.6Sequelize:^6......
  • 各厂商服务器存储默认管理口登录信息(默认IP、用户名、密码)收集
    在此收集了一些厂商的服务器存储设备的默认管理口信息,以供大家日后运维时方便查找,若有错误的地方请指正,谢谢!服务器管理口信息:存储管理口信息: 光纤交换机管理口信息:......
  • Mysql数据库引擎MYISAM和INNODB详解
    一、数据库​​引擎​​数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程......
  • DNA germline 变异可信度判定 (证据项收集)
    2022-11-2012:09:06星期日目的原先写过一个DNAgermline变异可信度判定,描述了一套评分机制,根据几项证据项进行变异可信度的判定,但是没有对证据项的来源进行描述的讲......
  • Animator工具函数收集
    1)获取AnimationClippublicstaticboolTryGetAnimatorClip(Animatoranimator,stringclipName,outAnimationClipoutClip){varclips=animator.runtimeAn......
  • MySQL8.0新特性—InnoDB增强
    1.自增变量持久化在MySQL8.0之前的版本中,自增列计数器置于内存中,并不会持久化到磁盘,当数据库重启后,会根据selectmax(id)+1fromxxx重新计算当前自增列值,这种现象在某些......
  • 一些有用的网站收集
    省流:1.w3school编程教程2.stackoverflowbug搜索3.tutorialspoint教程网站4.karan/Projects适合初学者的小项目5.程序员客栈程序员自由工作平台6.LintCode领......
  • #yyds干货盘点# 动态规划专题:字母收集
    1.简述:有一个  的矩形方阵,每个格子上面写了一个小写字母。小红站在矩形的左上角,她每次可以向右或者向下走,走到某个格子上就可以收集这个格子的字母。小红非常喜欢"love"......