目录
- 1. 索引基础
- 2. 索引类型2.1 哈希索引2.2 有序数组2.3 B+树索引(InnoDB)
- 3. 联合索引
- 4. 最左前缀原则
- 5. 覆盖索引
- 6. 索引下推
- 总结:
1. 索引基础
索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点,索引就是为了提高数据查询的效率。索引可以包含一个或多个列的值,如果索引包含多个列的值,则列的顺序也十分重要,因为MySQL只能高效地使用索引的最左前缀列。
2. 索引类型
用于提高读写效率的数据结构有很多,这里先介绍常见的3种,分别是:
- 哈希表
- 有序数组
- 搜索树(重点)
2.1 哈希索引
哈希表是一种以键-值(key-value)的方式存储数据的结构,我们只要输入待查找的值(即key),就可以找到其对应的值(即Value)。哈希的思路很简单,把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置,即idx = Hash(key)。如果出现哈希冲突,就采用拉链法解决。
因为哈希表中存放的数据不是有序的,因此不适合做区间查询,适用于只有等值查询的场景。
2.2 有序数组
有序数组在等值查询和范围查询场景中的性能都非常优秀。用二分法就可以快速找到(时间复杂度为O(logN))。但是如果要往中间插入一条数据,则必须挪动后面的所有记录,成本较高。因此,有序数组只适用于静态存储引擎,即数据表一旦建立后不再会修改。
2.3 B+树索引(InnoDB)
首先,得先好好理解什么是B+树!看单独介绍B树、B+树的文章,基于篇幅不在此赘述。简单的说,是因为使用B+树存储数据可以让一个查询尽量少的读磁盘,从而减少查询时磁盘I/O的时间。
在 InnoDB 中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。又因为前面我们提到的,InnoDB 使用了 B+ 树索引模型,所以数据都是存储在 B+ 树中的。每一个索引在 InnoDB 里面对应一棵 B+ 树。
假设,有这样一张表:该表主键为ID,且还有一个字段为k,并在k上有索引。
CREATE TABLE T(
id int primary key,
k int not null,
index (k)
)engine=InnoDB;
表中有5条记录,分别为R1~R5,(100,1)、(200,2)、(300,3)、(500,5)和(600,6)。则在InnoDB中的索引组织结构是这样的:
根据叶子结点的内容,索引类型分为主键索引和非主键索引。
- 主键索引的叶子结点存的是整条记录,主键索引也被称为聚簇索引(clustered index)。
- 非主键索引的叶子结点存的是主键的值,非主键索引也被称为二级索引(seco