一、综述
1、简介
前面提到,mysql按索引存储结构划分,主要有四种类型的索引:B-Tree索引、Hash索引、Full-text索引、R-Tree索引。
索引是帮助MySQL高效获取数据的排好序的数据结构,前置知识:树的高度越低查询效率越高。
2、索引数据结构
2.1、二叉树
问题:不能自平衡,极端情况出现倾斜,查询效率和链表类似。
2.2、红黑树
红黑树对数据进行平衡,解决了单边增长的问题;
问题:数据量大的不适合,数据量大的时候,树的高度不可控,从根节点到叶子节点,需要多次遍历查找,效率偏低。
2.3、hash
(1)对索引的key进行一次hash计算就可以定位出数据存储的位置
(2)很多时候Hash索引要比B+ 树索引更高效
(3)仅能满足 “=”,“IN”,不支持范围查询
(4)hash冲突问题
2.4、B-Tree
(1)叶节点具有相同的深度,叶节点的指针为空;
(2)所有索引元素不重复;
(3)节点中的数据索引从左到右递增排列;
2.5、B+Tree(B-Tree变种)
(1)非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
(2)叶子节点包含所有索引字段;叶子节点存放数据,非叶子节点存放键值+指针。
(3)叶子节点用指针连接,提高区间访问的性能
二、B-Tree索引
1、介绍
BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型,前面的普通索引、组合索引用的基本都是BTREE。
2、原理
B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。
以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key,
3、特点
--5阶的B树,每一个节点最多存储4个key,对应5个指针。
--一旦节点存储的key数量到达5,就会裂变,中间元素向上分裂。
--在B树中,非叶子节点和叶子节点都会存放数据。
4、总结
(1)每个索引都对应一棵B+树。用户记录都存储在B+树的叶子节点,所有目录记录都存储在非叶子节点。
(2)InnoDB存储引擎会自动为主键(如果没有它会自动帮我们添加)建立聚簇索引,聚簇索引的叶子节点包含完整的用户记录。
(3)可以为指定的列建立二级索引,二级索引的叶子节点包含的用户记录由索引列 + 主键组成,所以如果想通过二级索引来查找完整的用户记录的话,需要通过回表操作,也就是在通过二级索引找到主键值之后再到聚簇索引中查找完整的用户记录。
(4)B+树中每层节点都是按照索引列值从小到大的顺序排序而组成了双向链表,而且每个页内的记录(不论是用户记录还是目录项记录)都是按照索引列的值从小到大的顺序而形成了一个单链表。如果是联合索引的话,则页面和记录先按照联合索引前边的列排序,如果该列值相同,再按照联合索引后边的列排序。
通过索引查找记录是从B+树的根节点开始,一层一层向下搜索。由于每个页面都按照索引列的值建立了页目录,所以在这些页面中的查找非常快。
三、Hash索引
基于hash值和链表实现。
由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。
特点:
A. Hash索引只能用于对等比较(=,in),不支持范围查询(between,>,< ,...)
B. 无法利用索引完成排序操作
C. 查询效率高,通常(不存在hash冲突的情况)只需要一次检索就可以了,效率通常要高于B+tree索引。
四、Full-text索引
五、R-Tree索引
RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种,相对于BTREE,RTREE的优势在于范围查找。