mysql总结
sql执行过程
注:8.0版本mysql已经去掉了缓存功能。
1、未命中缓存
服务器连接->查询缓存->解析器(sql语法校验、生成语法树等)->查询优化器->执行计划->查询执行引擎->访问磁盘文件
2、命中缓存
服务器连接->查询缓存-查询执行引擎->访问磁盘文件
索引
索引是帮助Mysql高效获取数据的数据结构。
优点:
1、如同书目录,提高数据检索效率,降低数据库IO次数。
2、唯一索引,可以确保数据唯一性。
3、减少查询中分组和排序的时间,进而降低CPU消耗。
缺点:
1、创建索引,维护索引消耗时间。
2、索引需要占用一定的磁盘空间。
3、删除,插入数据降低更新表的时间。
索引的数据结构为B+树。
索引的存储存在数据页的概念。
1、每一个节点都会有多条数据,之间用单向链表管理。每层数据页之间双向链表关联。
2、主键索引,为聚簇索引,节点数据包含数据库行所有数据。而为聚餐索引包含的是与主键索引关系及地址,回表操作获取数据。
3、非底层节点,可以理解为目录页,则通过record_type表示数据的类型,0:普通数据,1:目录数据,2:表示当前页开始,3:表示当前页结束。
聚簇索引
二级索引(非聚簇索引)
B+树每个节点为一个数据页,是与内存交互的最小单位。
数据页结构:
1、文件头(38字节):
① 页号
② 页类型--索引页,系统页,undo log页等。
③ 前一页,后一页。
④ 校验和,可以用来校验内存中页与磁盘页是否有变化,文件头和尾都有FIL_PAGE_SPACE_OR_CHECKSUM这个属性,来校验页数据是否一致完整。
⑤ FIL_PAGE_LSN(log Sequence_number日志序列号)。记录日志修改位置。
2、文件尾(8字节): FIL_PAGE_LSN(log Sequence_number日志序列号)。记录日志修改位置。同文件头⑤一样,记录日志修改位置,如果不一致说明数据存在不一致,有问题了。
3、空闲空间:
存储用户记录,随着不断存储增加,空闲空间逐渐变小。
4、用户记录:
指定行格式,记录之间是单链表。如何知道记录行格式,则就在记录头信息中。
5、最大最小记录:
当前页的最小,最大记录。heap_no 最小为0,最大则为1.
记录头信息:
delete_mask:标记当前记录是否被删除,占1个二进制位,0:未被删除,1:已删除。
min_rec_mask:为叶子节点(目录页),住建目录项的最小记录设置为1,其他为0.
record_type:0普通记录,1目录,2:最小,3最大。
heap_no:当前记录在本页中的位置。两位伪记录0(最小),1(最大记录)。其他记录从2开始。
n_owned:页目录中每个组中最后一条记录的头信息中会存储该组一共有多少条记录,作为owned字段。
next_record:记录头信息里该属性非常重要,他表示从当前记录的真实数据到下一条记录的真实数据的地址偏移量。