ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql存储引擎索引实现

2021-07-04 22:31:58  阅读:154  来源: 互联网

标签:文件 存储 49 索引 myisam mysql test 主键


存储引擎是形容表的,一般来说默认就是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 文件,

标签:文件,存储,49,索引,myisam,mysql,test,主键
来源: https://blog.csdn.net/weixin_39436556/article/details/118467608

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有