剖析MySQL InnoDB存储原理(上)

电子说

1.2w人已加入

描述

一、MySQL记录的存储结构:

1、Page的结构,如下图:

MySQL

1.1 页头

记录页面的控制信息,共占56字节,包括页的左右兄弟页面指针、页面空间使用情况等。

1.2 虚记录

最大虚记录:比页内最大主键还大

最小虚记录:比页内最小主键还小

1.3 记录堆

行记录存储区,分为有效记录和已删除记录

1.4 自由空间链表

已删除记录组成的链表

1.5 未分配空间

页面未使用的存储空间;

2、Page页内记录的维护

2.1 顺序保证

逻辑连续,如图所示:

MySQL

2.2 插入策略

为了提高内存的利用率,减少内存碎片化空洞,首先从自由空间链表中分配(已删除的记录链表),如果空间不够再从未分配空间分配;

2.3 页内查询

二分查找,首先从物理连续的solt(0~n)中查找所在的solt位,然后再从page逻辑链表中找到所对应的记录;如图所示;

MySQL

3、Page页内数据特性

3.1 PageSize的固定大小为16KB

3.2 每页至少两天记录,单行最大为8KB

3.3 最多存储10个大字段

数据段最大768 ->(768+20)*10<8K

超出部分存储在溢出页

3.4 VARCHAR

1或2个字节描述字符长度;

实际内容存储在长度字节之后;

VARCHAR(255) [一个字节]+内容

VARCHAR(256) [两个字节]+内容

二、 InnoDB索引原理和优化

1、索引的原理分析

1.1 聚簇索引

数据存储在主键索引中,数据按主键顺序存储,如图所示:

MySQL

1.2 二级索引

除主键索引以外的索引,叶子中存储主键值

一次查询需要走两遍查询

主键大小会影响所有索引的大小,如图所示:

MySQL

1.3 联合索引

Key由多个字段组成,最左匹配原则

一个索引只创建一棵树按第一列排序

第一列相同按第二列排序

注意 :如果不是按照最左开始查找,无法使用索引,不能跳过中间列,某列使用范围查询后面的列不能使用索引。

2、索引的优化分析

2.1 存储空间

索引文件大小是由字段大小、页内节点数目、树的层数

2.2 主键的选择

自增主键,顺序写入,效率高

随机主键,结点分裂、数据移动

自增主键写入磁盘利用率高,每次查询走两级索引

随机主键写入磁盘利用率低,每次查询走两级索引

业务主键:写入查询磁盘利用率都高,可以使用一级索引

联合主键:影响索引大小,不易维护,不建议使用

2.3 联合主键

按索引区分度排序,并且覆盖索引;

2.4 字符串索引

字符是按照字节对比的,设置的时候注意控制长度;

不支持开头的%模糊查询,只能全表扫描;

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分