MySQL --索引
一、索引概述
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。 二、索引结构索引结构的选择
假如说MySQL的索引结构采用二叉树的数据结构,比较理想的结构(满二叉树或完全二叉树)如下: 如果主键是顺序插入的,则会形成一个单向链表,结构如下: 所以,如果选择二叉树作为索引结构,会存在以下缺点:- 顺序插入时会形成一个链表,查询性能大大下降
- 大量数据下,层级越深,检索速度越慢
- 大量数据下,层级越深,检索速度慢
特点:
- m阶的B-Tree,每一个节点最多存储 m-1 个Key,对应m个指针
- 一旦节点存储的Key达到m,就会裂变,中间元素向上裂变
- 在B树中,非叶子节点和叶子节点都会存储数据
B+Tree
介绍:
B+Tree是B-Tree的变种,我们以一颗最大度数(max-degree)为4(4阶)的b+tree为例,来看一下其结构示意图: 我们可以看到,两部分:- 绿色框框起来的部分,是索引部分,仅仅起到索引数据的部分,不存储数据
- 红色框框起来的部分,是数据存储部分,在其叶子节点中存储具体的数据
特点:
- 所以数据都会存储在叶子节点
- 叶子节点形成一个单向链表
- 非叶子节点仅仅起到索引数据的作用,具体数据都在叶子节点存放
特点:
- Hash只能用于对等比较(=,in),不支持范围查询(between,<,>等)
- 无法利用索引完成排序操作
- 查询效率高,通常(不存在hash冲突的情况)只需要一次检索就可以了,效率通常要高于B+tree索引
五、聚集索引和二级索引
而在在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:聚集索引选取规则:
- 如果存在主键,主键索引就是聚集索引
- 如果不存在主键,就会使用第一个唯一索引作为聚集索引
- 如果表中没有主键,也没有合适的位于索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引
- 聚集索引的叶子节点下挂的是这一行的数据
- 二级索引的叶子节点挂的是该字段值对应的主键