🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 索引结构 ## 1.索引结构 索引是在MySQL的存储引擎层中实现的,而不是在服务器层实现的。所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型的。MySQL目前提供了以下4种索引: - BTREE 索引 : 最常见的索引类型,大部分索引都支持 B 树索引。 - HASH 索引:只有Memory引擎支持 , 使用场景简单 。 - R-tree 索引(空间索引):空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少,不做特别介绍。 - Full-text (全文索引) :全文索引也是MyISAM的一个特殊索引类型,主要用于全文索引,InnoDB从Mysql5.6版本开始支持全文索引。 <center><b>MyISAM、InnoDB、Memory三种存储引擎对各种索引类型的支持</b></center> | 索引 | InnoDB引擎 | MyISAM引擎 | Memory引擎 | | ----------- | --------------- | ---------- | ---------- | | BTREE索引 | 支持 | 支持 | 支持 | | HASH 索引 | 不支持 | 不支持 | 支持 | | R-tree 索引 | 不支持 | 支持 | 不支持 | | Full-text | 5.6版本之后支持 | 支持 | 不支持 | 我们平常所说的索引,如果没有特别指明,都是指B+树(多路搜索树,并不一定是二叉的)结构组织的索引。其中聚集索引、复合索引、前缀索引、唯一索引默认都是使用 B+tree 索引,统称为 索引。 ## 2. B+TREE 结构 B+Tree为BTree的变种,B+Tree与BTree的区别为: 1). n叉B+Tree最多含有n个key,而BTree最多含有n-1个key。 2). B+Tree的叶子节点保存所有的key信息,依key大小顺序排列。 3). 所有的非叶子节点都可以看作是key的索引部分。 ![](https://img.kancloud.cn/ea/60/ea6097a50179c5b6b370b9fac9ff9bbe_2102x1012.png) 由于B+Tree只有叶子节点保存key信息,查询任何key都要从root走到叶子。所以B+Tree的查询效率更加稳定。 ## 3. MySQL中的B+Tree MySql索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能。 MySQL中的 B+Tree 索引结构示意图: ![](https://img.kancloud.cn/db/6f/db6f062ca8299486c969afe6278edb09_2116x674.png)