MySQL存储引擎索引实现

前言


数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySql的核心就是存储引擎。

存储引擎查看
MySQL给开发者提供了查询存储引擎的功能,我这里使用的是MySQL5.7,可以使用:

SHOW ENGINES;

MySQL存储引擎索引实现_第1张图片

接下来主要介绍两种引擎,InnoDB,MyISAM 

MySQL存储引擎索引实现_第2张图片

根据上图可知,MySQL数据和索引文件都存储在data目录下,每一个表都对应一个相同的文件夹,这里我们使用test库测试MySQL的存储引擎

MyISAM存储引擎

MySQL存储引擎索引实现_第3张图片

 通过MyISAM引擎创建的表包含3个文件

MySQL存储引擎索引实现_第4张图片

 MyISAM底层到底是如何存储的,下图所示(B+树结构)

MySQL存储引擎索引实现_第5张图片

非聚集索引,就是叶子节点存放索引和数据是分开的。

上图可以看出,MyISAM存放B+树,这个B+树叶子节点存放的data是一个磁盘地址,通过这个磁盘地址的指向,可以找到对应的数据。

假设现在有一条sql语句如下:

        select * from db_table where Col1=15

这条sql语句的执行逻辑:

        1. 首先去MYI文件中去快速定位15索引元素

        2. 将15索引元素下对应的磁盘地址获取到

        3. 将拿到的磁盘地址去MYD文件快读定位对应的记录

InnoDB存储引擎

MySQL存储引擎索引实现_第6张图片

 通过InnoDB创建的表包含两个文件

MySQL存储引擎索引实现_第7张图片

 InnoDB底层是如何存储数据的,下图所示(B+树结构)

MySQL存储引擎索引实现_第8张图片

聚集索引特点,索引和数据一起存放在叶子节点上。

 InnoDB引擎存储和MyISAM引擎存储区别:

        MyISAM叶子节点存储的是磁盘文件地址,InnoDB叶子节点存储的是对应索引的值。

为什么建议InnoDB表必须建主键?

        InnoDB表中的数据必须要有B+树的索引树来组织这个数据文件(如上图所示),没有这个B+树是无法做到数据的存储,因为他的根节点不光存储索引还要存储索引对应的数据。

mysql设计的时候让InnoDB表中,必须有B+树的索引结构来组织数据结构,如果创建表的时候没有指定主键,InnoDB他就会自动去从第一列数据查找,看此列的数据是否唯一,根据这个特性,来自动生成一个B+树索引结构,构建对应的数据结构进行存储,此时如果没有一列都是唯一数据的时候,InnoDB会自动生成row_id隐藏列(生成唯一值 )来构建B+树索引结构,维护表数据。

并且推荐使用整形?

        InnoDB在查找的过程中,会进行元素的比对,使用整形比较大小效率非常高,如果使用uuid作为主键,可能前多少位都是一样的,只有最后几位有所不同,字符串比较的过程是一位一位的进行比较,通过转化Ascii进行大小比较,这种比较的效率肯定是不如整形效率高,所以使用整形做主键比较大小效率会提高不少,包括存储整形所使用的内存比uuid所使用的内存要小得多。

为什么使用整形的自增主键?

首先B+树他是一个有序结构,如果使用uuid这种作为主键,当它插入元素的时候,不会依次在叶子节点后插入,很有可能会在节点的中间位置插入,如果当前节点存满索引后,B+树的特性树可能需要做平衡,自旋等情况,来达到顺序排列,非常消耗性能(如下图所示):

MySQL存储引擎索引实现_第9张图片

但如果是整形的自增长主键,就不会出现这个问题,他只会在叶子节点的后面添加元素。效率要比中间插入高很多,这也就是为什么使用整形的自增主键。

InnoDB非主键索引是如何进行存储的,我们那Col3字段作为二级索引(结构如下图所示)

MySQL存储引擎索引实现_第10张图片

二级索引是如何进行查询的呢?

首先通过Col3字段查询到Jim的id=20,然后根据这个id去主键索引树中查询结果,然后进行返回,这个过程称为回表

二级索引是不是聚集索引:

根据聚集索引的定义,叶子节点存储的是每行记录的值,但二级索引只存储的是id,所以不是聚集索引

但在实际项目中很少使用MyISAM引擎,基本都是用Innodb存储引擎

两种引擎优缺点

引擎 优点 缺点
InnoDB(准确至上) 1. 支持事务
2. 支持外键
3. 支持大规模并发
4. 适合频繁增、改、更新
1. 查询速度慢
2. 不支持全文索引
3. 必须包含只有该自增字段的索引
MyISAM(效率至上) 1. 查询速度快,适合大量select
2. 支持全文索引
3. 支持复合索引
4. 适合统计行数
1. 不支持事务
2. 不支持外键
3. 并发量较小
4. 不适合频繁增改

你可能感兴趣的:(mysql底层原理,mysql,数据库)