索引下推和索引跳跃

索引下推

Index Condition Pushdown(索引下推) MySQL 5.6引入了索引下推优化,默认开启,使用SET optimizer_switch = ‘index_condition_pushdown=off’;可以将其关闭。官方文档中给的例子和解释如下: people表中(zipcode,lastname,firstname)构成一个索引

SELECT * FROM people WHERE zipcode=‘95054’ AND lastname LIKE ‘%etrunia%’ AND address LIKE ‘%Main Street%’;

如果没有使用索引下推技术,则MySQL会通过zipcode='95054’从存储引擎中查询对应的数据,返回到MySQL服务端,然后MySQL服务端基于lastname LIKE '%etrunia%'和address LIKE '%Main Street%'来判断数据是否符合条件。 如果使用了索引下推技术,则MYSQL首先会返回符合zipcode='95054’的索引,然后根据lastname LIKE '%etrunia%'和address LIKE '%Main Street%'来判断索引是否符合条件。如果符合条件,则根据该索引来定位对应的数据,如果不符合,则直接reject掉。 有了索引下推优化,可以在有like条件查询的情况下,减少回表次数。

数据库在取出索引的同时,会根据where条件直接过滤掉不满足条件的记录,减少回表次数。

索引跳跃(Index Skip Scan)

MySQL 8.0.13 引入的优化,某种程度上可以无视最左前缀原则。

假设我们有联合索引(a,b),以下查询语句: *select from table where b=xxx

在开启该优化后会被转换为: select from table where a = 1 and b = xxx union select * from table where a = 2 and b =xxx. .......* 列出所有索引 a的可能情况,最后用union合并,达到走索引的目的。不过有限制条件

  1. select选择的字段不能包含非索引字段

  2. sql中不能带group by或者distinct语法

  3. Skip scan 仅支持单表查询,多表关联是无法使用该特性。

  4. 对于组合索引([A_1..A_k,] B_1...B_m,C[, D_1, ....D_n]),A,D 可以为空,但是B ,C字段不能为空。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值