当前位置:网站首页>【MySql进阶】索引详解(一):索引数据页结构
【MySql进阶】索引详解(一):索引数据页结构
2022-07-07 14:21:00 【空指针异常1】
InnoDB的数据页结构
概述
InnoDB 为了不同的目的而设计了许多种不同类型的 页 ,比如存放表空间头部信息的页,存放 Insert Buffer信息的页,存放 INODE 信息的页,存放 undo 日志信息的页等。而用来存放用户保存数据的页就是 innoDB的基本储存结构:索引页。(即数据页)。
它是 InnoDB 管理存储空间的基本单位,刷盘(从内存到硬盘)、读取操作,都是每次一页。
页面最大为16KB
innoDB的索引数据结构为B+树,而树的每个节点则为“页”,B+树同一层级的页为双向链表连接。
一张数据页会包含以上的部分,其中,(最小记录、最大记录、用户记录、空闲空间),为行记录(自造的词语,即储存时遵守行格式的结构)。
页结构介绍
文件头部
File Header 针对各种类型的页都通用,也就是说不同类型的页都会以 File Header 作为第一个组成部分,它描述了一些针对各种页都通用的一些信息,比方说这个页的编号是多少,它的上一个页、下一个页是谁。这个部分占用固定的 38 个字节
FIL_PAGE_SPACE_OR_CHKSUM
这个代表当前页面的校验和(checksum)。
对于很长的字节串来说,会通过某种算法(比如MD5)来计算/压缩为一个较短的值来表示,即为校验和。
比较两个数据是否相同,则可以先比较其校验和,如果校验和都不同,则数据肯定不同,能够大大降低比较的空间和时间。
FIL_PAGE_TYPE
这个代表当前 页
的类型, InnoDB 为了不同的目的而把页分为不同的类型,我们存放记录的数据页的类型其实是 FIL_PAGE_INDEX ,也就是所谓的 索引页 。
文件尾部
同样有校验和字段,用于和文件头的校验和相对比。
以保证刷盘的时候数据保存完整。防止刷盘刷到一半,断电、宕机。这样
页目录
innoDB会对数据进行分组,将每个组的最后一条记录的地址偏移量单独提取出来按顺序存储到靠近页的尾部的地方,这个地方就是所谓的 Page Directory ,也就是 页目录 。页面目录中的这些地址偏移量被称为 槽 (英文名: Slot ),所以这个页面目录就是由 槽 组成的。
我们在查找数据的时候,在定位到数据在某一页的情况下,该如何在页内的数据中进行快速查找呢?
我们知道,页内的数据组成的是一个链表,如果查找只能挨个遍历,这样就很慢,此时就有了页目录这个东西。
- innoDB会对用户记录进行分组,其中,最小记录单独一组,最大记录跟尾部的记录一组。最大记录所在的分组数量为1-8条,普通记录所在分组4-8条。
- 在向其中添加数据时,会在
页目录
中找到比当前主键值大,且数值最接近的组,并对其对应记录的n_owned 值加1。 - 直到 一组的数量达到8,此时再向该组中插入数据会将组中的记录拆分成两组,一组4条一组5条,页目录中相应的也会增加一个槽。
所以在一个数据页中查找指定主键值的记录的过程分为两步:
- 通过二分法确定该记录所在的槽,并找到该槽中主键值最小的那条记录。
- 通过记录的 next_record 属性遍历该槽所在的组中的各个记录
页面头部
为了能得到一个数据页中存储的记录的状态信息,比如本页中已经存储了多少条记录,第一条记录的地址是什么,页目录中存储了多少个槽等等,特意在页中定义了一个叫 Page Header 的部分,它是页 结构的第二部分, 这个部分占用固定的 56 个字节,专门存储各种状态信息 。页面头部的组成部分如下:
PAGE_DIRECTION
假如新插入的一条记录的主键值比上一条记录的主键值大,我们说这条记录的插入方向是右边,反之则是左边。用来表示最后一条记录插入方向的状态就是 PAGE_DIRECTION 。
PAGE_N_DIRECTION
假设连续几次插入新记录的方向都是一致的, InnoDB 会把沿着同一个方向插入记录的条数记下来,这个条数就用 PAGE_N_DIRECTION 这个状态表示。当然,如果最后一条记录的插入方向改变了的话,这个状态的值会被清零重新统计。
边栏推荐
- Performance measure of classification model
- [vulnhub range] thales:1
- Prediction - Grey Prediction
- [summary of knowledge] summary of notes on using SVN in PHP
- 【知识小结】PHP使用svn笔记总结
- "The" "PIP" "entry cannot be recognized as the name of a cmdlet, function, script file, or runnable program."
- 01tire+链式前向星+dfs+贪心练习题.1
- 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
- Introduction to ThinkPHP URL routing
- 【DesignMode】外观模式 (facade patterns)
猜你喜欢
记一次项目的迁移过程
Spark Tuning (III): persistence reduces secondary queries
Odoo integrated plausible embedded code monitoring platform
Pycharm terminal enables virtual environment
【医学分割】attention-unet
Shandong old age Expo, 2022 China smart elderly care exhibition, smart elderly care and aging technology exhibition
删除 console 语句引发的惨案
无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
Tragedy caused by deleting the console statement
2022 the 4th China (Jinan) International Smart elderly care industry exhibition, Shandong old age Expo
随机推荐
Three. JS series (2): API structure diagram-2
Markdown formula editing tutorial
修改配置文件后tidb无法启动
01tire+链式前向星+dfs+贪心练习题.1
laravel中将session由文件保存改为数据库保存
Record the migration process of a project
【DesignMode】模板方法模式(Template method pattern)
TiDB For PostgreSQL和YugabyteDB在Sysbench上的性能对比
ThinkPHP URL 路由简介
Rongyun won the 2022 China Xinchuang digital office portal excellence product award!
markdown公式编辑教程
laravel post提交数据时显示异常
[Android -- data storage] use SQLite to store data
Apache Doris just "graduated": why should we pay attention to this kind of SQL data warehouse?
Pycharm terminal enables virtual environment
Balanced binary tree (AVL)
Enterprise log analysis system elk
Step by step monitoring platform ZABBIX
Geoserver2.18 series (5): connect to SQLSERVER database
What are compiled languages and interpreted languages?