Mysql 的索引底层原理
1.什么是索引?
索引是一种排好序的数据结构,mysql目前默认使用的是b+树。
2.为什么使用b+树?
例如表table 数据
id | name |
1 | zs |
2 | ls |
3 | sa |
4 | zl |
5 | wmz |
6 | zs |
7 | sd |
这这个表里,没有加索引,要查询id= 6的数据,至少要查询6次,才能找到想要的那条数据 select * from table where id = 6;
1) 二叉树
最多只有两个叶子节点,也可以没有叶子节点
为什么不选用二叉树?
根据二叉树的特点,如果是顺序的节点进行排列,则会形成链表的结构,此时查询跟没有使用索引是一样的效果,查询的次数过多,故不推荐使用。
2) 红黑树
这种树结构用的比较多,例如jdk1.8的hashmap中就是这树结构,但是mysql仍然没有采用这种树结构。
平衡二叉树:即左右节点的长度超过2时,会自动旋转达到平衡的状态,旋转次数过多,效率较低。
红黑树特点,节点不是红就是黑,从任一节点到叶子的节点包含的黑色节点数目都是相同的,旋转的次数较少,效率高,但是树的高度较高,因此查询的次数仍然较多。
3)hash
这目前也是mysql官方保存的一种索引结构。
hash索引主要是将该列进行hash计算之后指向一个地址,每次查询的时候,时间复杂度为O(1),查询效率非常高。但是由于生成的hash码是无规则的,所以不能进行排序操作,也不能进行范围查询,所以只适用于确定值的查询。
4)b+树
官方推荐使用索引。
b树:每个节点有多个叶子节点,根节点到每个叶子节点的长度相同,高度为m,叶子节点最多为m-1;且每个中间节点和叶子节点均有数据
b树可以限制树的高度,从而达到查询次数较少目的。但是范围查询仍然需要进行遍历操作,所以对于范围的查询不太适用。
b+树:b+树的数据集中在叶子节点,并且索引是按顺序进行存放的,所以可以很快的进行范围的查询。
3.mysql数据库的引擎
1)myisam
myisam引擎在本地生成三个文件,后缀分别为*.frm,*.MYI,*.MYD, frm文件是创建的表结构,MYI是索引文件,MYD是数据文件
不支持事务操作。
非聚集索引:索引和数据没有绑定在一起
2)innodb
innodb引擎在本地生成两个文件,后缀分别为*.frm,*.ibd, frm 文件是创建的表结构,ibd是文件包含了索引以及数据
支持事务操作。
聚集索引:索引和数据绑定在一起
4.使用自增的整型作为主键索引
使用整型而不是uuid这种类型,因为在遍历比较的时候,整型比字符串类型速度更快
使用自增长,能够更快的生成b+树,性能能够得到提升。