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引擎 Innodb和MyISAM的区别

mysql索引实现

如何查看mysql数据库表里的数据

mysql存储引擎索引实现

mysql存储引擎索引实现

MySQL索引实现