一、索引概述
1.1 介绍
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构 上实现高级查找算法,这种数据结构就是索引
争对与一张表有无设计索引的情况
如果有索引,那么这个时候形成的二叉树索引结构效率上比全表扫描要快很多
1.2 索引的优缺点
优点 | 缺点 |
提高数据检索的效率,降低数据库 的IO成本 | 建立的索引列也是会占取一定空间的 |
通过索引列对数据进行排序,降低 数据排序的成本,降低CPU的消 耗 | 索引大大提高了查询效率,同时却也降低更新表的速度, 如对表进行INSERT、UPDATE、DELETE时,效率降低。 |
1.3 创建、查看、删除索引的语法
创建索引
CREATE [ UNIQUE | FULLTEXT ] INDEX index_name ON table_name (
index_col_name,... )
查看索引
SHOW INDEX FROM table_name
删除索引
DROP INDEX index_name ON table_name
二、索引底层的数据结构
2.1 基于现阶段默认InnoDB存储引擎下介绍其底层的数据结构
索引的底层是B+tree,B+Tree是B-Tree的变种,这里我们可以基于下方这个网站学习结构
B+ Tree Visualization (usfca.edu)https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
2.2 B+tree
B+tree特点:
- 所有的数据都会出现在叶子节点。
- 叶子节点形成一个单向链表。
- 非叶子节点仅仅起到索引数据作用,具体的数据都是在叶子节点存放的。
区别于MySQL中的索引底层:
MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点 的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能,利于排序,叶子节点就形成了一个双向链表
2.3 B-Tree
B-Tree,B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。 以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key,5 个指针
B-Tree Visualization (usfca.edu)https://www.cs.usfca.edu/~galles/visualization/BTree.html
特点:
- 5阶的B树,每一个节点最多存储4个key,对应5个指针
- 一旦节点存储的key数量到达5,就会裂变,中间元素向上分裂
- 在B树中,非叶子节点和叶子节点都会存放数据
三、索引分类
3.1 MySQL中的索引分类
分类 | 含义 | 特点 | 关键字 |
主键索引 | 针对于表中主键创建的索引 | 默认自动创建, 只能有一个 | PRIMARY |
唯一 索引 | 避免同一个表中某数据列中的值重复 | 可以有多个 | UNIQUE |
常规索引 | 快速定位特定数据 | 可以有多个 | |
全文索引 | 全文索引查找的是文本中的关键词,而不是比较索引中的值 | 可以有多个 | FULLTEXT |
对于全文索引来说,用的比较少
3.2 聚集索引、二级索引
根据索引的形式上来分,可以抽取为聚集索引和二级索引
分类 | 含义 | 特点 |
聚集索引(Clustered Index) | 将数据存储与索引放到了一块,索引结构的叶子 节点保存了行数据 | 必须有,而且只 有一个 |
二级索引(Secondary Index) | 将数据与索引分开存储,索引结构的叶子节点关 联的是对应的主键 | 可以存在多个 |
聚集索引选取规则:
- 如果存在主键,主键索引就是聚集索引
- 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引
- 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引
设表结构,聚集索引和二级索引的具体结构如下:
图来源黑马MySQL教程
我们可以看出聚集索引的叶子节点挂载的是row(行数据),二级索引的叶子节点下挂载的是该字段的对应主键id值
3.3 回表查询
到二级索引中查找数据,找到主键值,然后再到聚集索引中根据主键值,获取 数据的方式,就称之为回表查询。
执行一条sql
select * from user where name = 'Arm'
图来源黑马MySQL教程
对应的表结构如上图,三个字段,id,name,gender
对于上述执行的sql,根据name去查询数据,这个时候走二级索引,发现gender没加索引,所以会根据主键id进行回表查询,再次走聚集索引