mysql 索引笔记

MyISAM引擎的B+Tree的索引

myisam

通过上图可以直接的看出, 在MyISAM对B+树的运用中明显的特点如下:

所有的非叶子节点中存储的全部是索引信息

在叶子节点中存储的 value值其实是 数据库中某行数据的index

MyISAM引擎 索引文件的查看:

在 /var/lib/mysql目录中

.myd 即 my data , 数据库中表的数据文件

.myi 即 my index , 数据库中 索引文件

.log 即 mysql的日志文件

InnoDB引擎 索引文件的查看:

同样在 /var/lib/mysql 目录下面

InnoDB引擎的B+Tree的索引

InnoDB

InnoDB的实现方式业内也称其为聚簇索引, 什么是聚簇索引呢? 就是相邻的行的简直被存储到一起, 对比上面的两幅图片就会发现, 在InnDB中, B+树的叶子节点中存储的是数据行中的一行行记录, 缺点: 因为索引文件被存放在硬盘上, 所以很占硬盘的空间

一般我们会在每一个表中添加一列 取名 id, 设置它为primary key , 即将他设置成主键, 如果使用的存储引擎也是InnoDB的话, 底层就会建立起主键索引, 也是聚簇索引, 并且会自动按照id的大小为我们排好序,(因为它的一个有序的树)

点击查看 参考博文1

局部性原理

局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。 更进一步说, 当我们通过程序向操作系统发送指令让它读取我们指定的数据时, 操作系统会一次性读取一页(centos 每页4kb大小,InnoDB存储引擎中每一页16kb)的数据, 它遵循局部性理论, 猜测当用户需要使用某个数据时, 用户很可能会使用这个数据周围的数据,故而进行一次

InnoDB的页格式

什么是页呢? 简单说,就是一条条数据被的存储在磁盘上, 使用数据时需要先将数据从磁盘上读取到内存中, InnoDB每次读出数据时同样会遵循 局部性原理, 而不是一条条读取, 于是InnoDB将数据划分成一个一个的页, 以页作为和磁盘之间交互的基本单位

通过如下sql, 可以看到,InnoDB中每一页的大小是16kb

show global status like 'Innodb_page_size';

数据页图片

名称 简述
File Header   文件头部, 存储页的一些通用信息  
Page Header   页面头部, 存储数据页专有的信息  
Infinum + supremum   最大记录和最小记录, 这是两个虚拟的行记录  
User Records   用户记录, 用来实际存储行记录中的内容  
Free Space   空闲空间, 页中尚位使用的空间  
Page Directory   页面目录, 存储页中某些记录的位置  
File Tailer   文件尾部 , 用来校验页是否完整  
InnoDB的行格式 compact

每一页中存储的行数据越多. 整体的性能就会越强

compact的行格式如下图所示

compact

可以看到在行格式中在存储真正的数据的前面会存储一些其他信息, 这些信息是为了描述这条记录而不得不添加的一些信息, 这些额外的信息就是上图中的前三行

变长字段的长度列表

在mysql中char是固定长度的类型, 同时mysql还支持诸如像 varchar这样可变长度的类型, 不止varchar , 想 varbinary text blob这样的变长数据类型, 因为 变长的数据类型的列存储的数据的长度是不固定的, 所以说我们在存储真正的数据时, 也得将这些数据到底占用了多大的长度也给保存起来

NULL标志位

compact行格式会将值可以为NULL的列统一标记在 NULL标志位中, 如果数据表中所有的字段都被标记上not null , 那么就没有NULL值列表

记录头信息

记录头

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfdwz.html