深入浅出索引(下篇)
创建时间:2021年11月11日12:09:16
文章目录
——————————————————————————————
索引查询流程
问:一个查询语句的索引执行流程如何?
答:假设字段k是普通索引,下面是一个范围查找,假设符合条件的共3条
select * from T where k between 3 and 5
1、查询k索引树得到r1主键
2、回表得到r1行的数据,返回给server层
3、直接获取下一个k索引树叶节点的下一节点,满足条件
4、重复第二步骤
5、重复上述步骤,直到第三步骤的获取节点不满足条件
最后:server层判定k索引树的扫描行数为3行(根据server层接收的结果),实际扫描行数是4行(第四行是k=6,不满足条件)
问:什么是回表?
答:通过普通叶节点的值去进行聚簇索引树值查询的过程。
索引覆盖
问:什么是索引覆盖?作用是什么?
答:又称覆盖索引,不是一种索引类型。当所需要的业务查询内容在普通索引上时,称其为索引覆盖。
能减少回表,提高效率。一般采用联合索引的形式实现索引覆盖。
最左前缀原则
问:什么是联合索引?
答:多个字段组合而成的索引。索引树中按照联合索引的字段排序进行组建,并遵循最左前缀原则。
问:什么是最左前缀原则?
答:如果字段是非字符,则查询时仅第一个字段的相关内容检索也可以利用上索引树,字符类型则前n个字符都可以利用上索引树。
问:怎么设计联合索引?
答:
性能上:选用检索频率较高的字段做为第一字段
空间上:当存在多个索引时,将占用空间较短的作为单独索引。
PG:
a:bigint(8),b:int(4)
联合索引(ab)。索引(b)
问:联合索引的实战场景?
答:
1、覆盖索引;
2、排序;
PG:联合索引(ab)
select * from T where a = '' order by b
索引下推
问:联合索引中第一个字段被模糊匹配,第二字段能否利用得上?
答:5.6及以后,可以。
在此之前,只要第一个字段被模糊匹配,第二个字段不会索引生效。
5.6及之后,会提前进行索引下推(过滤不符合第二个字段的数据),以减少回表次数,提高性能。