索引数据结构
1、 二叉搜索树(Binary Search Tree)
二叉搜索树是每个节点最多有两个子节点的树,按照右侧子节点大于本节点,左侧子节点小于本节点的规律排列,可以用作搜索,结构如下图所示
二叉树虽然可以用于查找,但在某种特定情况下查找效率并不高,类似于下图:
2、红黑树
对于二叉树的缺点,红黑树是一种拥有自平衡属性的二叉树,红黑树有五个特性:
- 每个结点是黑色或者红色。
- 根结点是黑色。
- 每个叶子结点(NIL)是黑色。 [注意:这里叶子结点,是指为空(NIL或NULL)的叶子结点!不是有值的最后一个节点。]
- 不能有两个相连的红色节点。
- 每个结点到叶子结点NIL所经过的黑色结点的个数一样的。
根据以上五种属性,红黑树生成时采用左旋,右旋,左右旋,右坐旋等才做,会生成出一颗相对平衡的二叉树,如下图
3、Hash表
Hash表类似于java中的hashMap,把索引列做hash映射后以KV结构存储在内存中,是精准查找最快的索引结构,只需要一次hash便可以定位,但不支持范围查找。
就是个K-V结构,不画图了
4、B-Tree
由于数据库要存储大量的数据,如果采用二叉树进行查找,数据量过大时二叉树的层级过多,需要由上到下进行查找效率过慢,所以出现了B-Tree,BTree有如下特征
·叶节点具有相同的深度
·叶节点的指针为空
·所有索引元素不重复
·节点中的数据索引从左到右递增排列
数据结构直接上图
5、B+Tree
不过mysql真正采用的不是BTree,Btree在做索引的时候有些地方并不是很实用,最终优化出了B+tree作为mysql innoDB存储类型的索引,B+tree的特征如下
- 非叶子节点不存储data,只存储索引(冗余)
- 可以放更多的索引
- 叶子节点包含所有索引字段
- 叶子节点用指针连接,提高区间访问的性能
结构如下图
PS:innoDB中的主键索引的B+tree是聚集索引,叶子结点直接存储的其他字段的值,用于减少IO的次数,而辅助索引的叶子结点则是存储的主键的值,用于辅助查找
mysql主要索引类型
1:MyISAM存储引擎索引实
MyISAM的索引和数据文件是分开的(非聚集索引),索引的叶子节点存储的是数据的物理地址,查找到相关索引后再用索引去硬盘上查找数据
2:InnoDB存储引擎索引实现
InnoDB的索引是和数据存储在一起的(聚集索引),叶子结点中存储了所有其他字段的值,只需要一次加载叶子结点的IO进行索引匹配,匹配成功后不需要再次进行IO操作读取对应的数据
--表数据文件本身就是按B+Tree组织的一个索引结构文件
--非主键索引结构叶子节点存储主键值的原因是为了一致性和节省存储空间
3: 联合索引的底层存储结构
联合索引是根据索引建立时字段的排列顺序建立的索引,后续索引是对第一个字段索引的再划分,差找时如果不能保证按照索引简历时的顺序进行查询,则联合索引失效
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。