MySQL数据库索引

前几天看了一个mysql索引的视频,一直没有整理,今天突然想到在博客中记录一下,仅做自己记录整理用,如果对您有帮助那再好不过!

什么是索引?

索引是帮助mysql高效获取数据的排好序的数据结构

例如有如下的表:


MySQL数据库索引_第1张图片

如果索引的数据结构是二叉树的话,索引在col2上,那么可能是这种情况:


MySQL数据库索引_第2张图片

如果索引的数据结构是二叉树的话,索引在col1上,那么就是这种情况:


MySQL数据库索引_第3张图片

成为了这种线性结构,二叉树的深度是不可控的,这样会增加磁盘I/O的次数,降低查询效率。那么我们用红黑树替代


MySQL数据库索引_第4张图片

虽然红黑树能够自动平衡,但是实际上树的高度还是不能够控制。这时候就用到了B-tree


MySQL数据库索引_第5张图片

类似这种,将节点的容量扩大,从而达到降低树的深度的目的来减少I/O操作。将节点数据读取到内存中查找远比一次I/O的时间少。B-tree的特点就是每层节点数目非常多,层数很少。但是每个节点都是data域(指针)这无疑增大了节点大小,增加了磁盘I/O的时间,那么接下来就是mysql最终确定的B+tree,B+tree将所有的data都放到了叶子结点上

B+tree在不同引擎下的表现

MyISAM索引实现,MyISAM索引文件和数据文件是分离的

.frm -->表结构;

.MYI-->索引数据;

MYD-->数据

InnoDB索引和数据在一起

.frm-->表结构;

.ibd(index,data)

Innodb必须有主键,推荐使用整型。如果建表没有建,mysql也会主动建。

为什么要用整型?

1、在查找索引比较大小时,整型要比字符串更方便;

2、字符串不管是在磁盘中还是内存中都要比整型更占内存;

为什么自增?

好维护索引数据。新增一条数据,如果不是自增会发生裂变

索引数据结构如果采用hash,用hash表存储索引与数据的对应关系,查找更快,但是当条件出现范围,如>用不到索引

如果内容对大家有所帮助,感谢大家打赏鼓励!

你可能感兴趣的:(MySQL数据库索引)