mysql索引笔记
常见索引的类型
- hash索引
适用于等值查询的场景 - 有序数组
适用于等值查询和范围查询 - 搜索数
InnoDB B+树索引
innoDB的索引分2种
- 聚簇索引(也叫主键索引)
-
二级索引(也叫非主键索引)
image.png
图中左边是聚簇索引,右边是二级索引,两者最大的区别就是叶子节点的内容不一样,聚簇索引的内容是整行数据,二级索引的内容是行的主键。
索引插入
image.png插入700时,加到R5后面。
image.png
插入400时,R4,R5移动空出位置。如果R5所在的数据页已满的情况下,会申请新的页,然后将部分数据挪到新页,这个过程叫页分裂。
索引的等值查找
select * from T where ID=500 该语句是主键查找方式,直接搜索聚簇索引,即图中左边的索引,直接得到R4.
select * from T where k=5 该语句走的是右边的二级索引,查询到的是500这个主键,所以需要再用500去左侧主键索引搜索,查询到R4这个数据,也就是说二级索引搜索要扫描2次,一次是二级索引,另外一次是主键索引,这个过程叫回表。
索引的范围查找
select * from T where k between 3 and 5
image.png
第一步:使用3扫描二级索引取得ID=300,拿着300扫描主键索引得到R3。
第二部: 取下一个值k=5 取得ID=500,拿着500扫描主键索引得到R4。
第三步: 取下一个值 K=6,不满足 between 3 and 5 的条件,循环结束。
覆盖索引
select ID from T where k between 3 and 5
该语句只查ID,因为二级索引的叶子节已经是ID,所有不需要回表,可以理解为索引已经覆盖了结果范围。
最左前缀原则
image.png如图的索引,当查张三时,可以快速定位到ID4,然后遍历所需的结果。
where name like ‘张%’ 也能用上索引。
最左前缀可以是联合索引的最左N个字段,也可以是字符串索引的最左M个字符。
索引下推
select * from tuser where name like '张%' and age=10 and ismale=1;
在MySQL 5.6之前,只能从ID3开始一个个回表。到主键索引上找出数据行,再对比字段值
MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索
引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。
image.png