前几天看了一个mysql索引的视频,一直没有整理,今天突然想到在博客中记录一下,仅做自己记录整理用,如果对您有帮助那再好不过!
什么是索引?
索引是帮助mysql高效获取数据的排好序的数据结构
例如有如下的表:
如果索引的数据结构是二叉树的话,索引在col2上,那么可能是这种情况:
如果索引的数据结构是二叉树的话,索引在col1上,那么就是这种情况:
成为了这种线性结构,二叉树的深度是不可控的,这样会增加磁盘I/O的次数,降低查询效率。那么我们用红黑树替代
虽然红黑树能够自动平衡,但是实际上树的高度还是不能够控制。这时候就用到了B-tree
类似这种,将节点的容量扩大,从而达到降低树的深度的目的来减少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表存储索引与数据的对应关系,查找更快,但是当条件出现范围,如>用不到索引
如果内容对大家有所帮助,感谢大家打赏鼓励!
网友评论