mysql存储引擎索引实现

Posted 偶像java练习生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql存储引擎索引实现相关的知识,希望对你有一定的参考价值。

存储引擎是形容表的,一般来说默认就是INNODB,一般来说mysql 是将数据存在磁盘上面的,一 一对应如下:
在这里插入图片描述

innodb 存储引擎 下的文件

  1. 大家看到没,test_innodb_lock 表对应的是两个文件: 分别是test_innodb_lock.frm ,test_innodb_lock_ibd 文件

test_innodb_lock.frm:表结构文件
test_innodb_lock_ibd : 索引和数据文件

下面给大家举个例子:test_innodb_lock_ibd 文件
在这里插入图片描述
2. 如图我们看到索引的叶子节点是直接带着一行数据的,不像myisam存储引擎存的value 是磁盘文件地址指针。

聚集索引:索引跟数据聚集在一个文件里,
扩充: innoDB的主键索引就是一个聚集索引,

非聚集索引:索引跟数据分开存储叫非聚集索引,

为什么INNODB表必须有主键,并且推荐使用整形的自增主键

  1. 如果你没有在表里面创建主键,INNODB 会在表里面找一个可以作为主键的一列,如果找不到唯一表示的一列,INNODB 它来帮你维护一列来作为主键,为什么推荐整形了?在你们开发过程中是不是也用过UUID 作为主键,像为abc2… 这样的字母,那你们觉得是字母比较大小比较快还是整形数字比较大小比较快,当然是整型比较快,因为UUID 还要转为Acsii 国标码,然后按照国标码一一排序那就相当麻烦,性能没有整型快,并且uuid 比较长,占用磁盘空间也比较大!所有推荐使用整型!为什么推荐使用自增?B +tree 每个节点从左到右都是通过递增的顺序来维护。

在这里插入图片描述

myisam存储引擎下的文件

  1. test_myisam 这张表对应的文件有test_myisam.frm,test_myisam.MYD,test_myisam,MYI;
  1. test_myisam 的意思是表结构的一些定义
  2. test_myisam.MYD MY 的意思就是MYISAM 的简写,D 代表data 所以这个文件是存所有的行数据
  3. test_myisam,MYI MY 的意思就是MYISAM 的简写, I 代表index 所有这个文件代表索引的

下面我来举个例子:
在这里插入图片描述
如图:对应MYISAM 存储引擎下的一个MYI 文件,也就是存储索引的文件,col1,col2,col3 是一张表, Primary key 代表索引的数据结构,
0x07 一列代表的是当前索引代表的物理磁盘地址。

假如有这么一条语句:假设col1 是索引
select * from t where col1 =49;

  1. mysql 的执行过程就是先判断这个字段是不是索引字段,如果是索引字段,则去MYI 文件里面,根据B+TREE的数据结构去查找到当前等于49的索引元素 ,先从根节点开始查找,根节点是常住内存的,先跟15 比对,大于15 则再跟56 对比,发现小于56,则左边的指正指向下面那一层。
  2. 然后将下一个节点拿到内存中区,也就是途中的{15,20,49} ,发现15,20 小于49, 右边49 等于49,第二行右边的指针会指向下一行,将下一行(49,50)拿到内存中去,然后再去跟49 比对,一下找到了49 这个节点,49 是放在key 中的,value 对应的是磁盘文件地址指针,我们拿到这个磁盘文件地址指正,快速的在MYD 文件中定位这一行。

INNODB 跟MYISAM 性能比较

INNODB 性能高于MYISAM ,原因在于 MYISAM 要查找两次,一次是过滤 MYI 文件,一次是过滤 MYD 文件,而INDODB 只要一次过滤在IBD 文件,

以上是关于mysql存储引擎索引实现的主要内容,如果未能解决你的问题,请参考以下文章

MySQL存储引擎,索引及基本优化策略

mysql中常见的存储引擎和索引类型

MySQL innodb引擎深入讲解

MYSQL 索引类型

MySQL学习笔记-存储引擎

MySQL索引详解