MySQL 索引

由于本篇文章侧重于 MySQL 索引的应用,所以并没有完全详细的介绍 B+ 树索引,但 B+ 树索引又是 MySQL 中默认使用的索引,所以关于 B+ 树索引细节介绍可见 B+ 树索引

索引介绍

索引是一种用于快速查询和检索数据的数据结构,其本质可以看作是一种排好序的数据结构

索引类似于书的目录,如果一本书没有目录,那么对于读者来说就是一场噩梦,目录可以加快我们查找的速度和效率,索引的作用也一样

索引底层数据结构有很多种类型,常见的索引结构:B 树、B+ 树、Hash 表、红黑树。在 MySQL 中,无论是 InnoDB 存储引擎,还是 MyISAM 存储引擎,使用的都是 B+ 树索引

索引优缺点

优点:

缺点:

注意:有时候「二级索引 + 回表」的速度并不一定比「全表扫描」快,因为可能回表次数过多,而且页在物理存储上较为分散,需要进行多次磁盘 IO 将对应页加载到内存中,耗时大

索引底层数据结构

Hash 表

将索引列映射到哈希表中,即:key = 索引列的值,value = 记录的位置,通过 key 可以快速获取记录的位置,在没有哈希冲突的情况下时间复杂度 O(1),可以用链地址法或开放定址法解决哈希冲突

MySQL 之所以没有使用 Hash 表作为索引的底层实现,是因为 Hash 表不支持顺序查询和范围查询,只支持每次查询一个

B 树 & B+ 树

B 树也称 B- 树,全程为多路平衡查找树,B+ 树是 B 树的一个变体。B 树和 B+ 树中的 B 是Balanced的意思。目前大部分数据库系统及文件系统都采用 B- 树或其变体 B+ 树作为索引底层实现

B 树和 B+ 树的区别:

索引的类型

从数据结构维度划分:

从底层存储方式划分:

从应用维度划分:

使用索引的建议