本文主要是介绍索引下推和索引跳跃,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
索引下推
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合并,达到走索引的目的。不过有限制条件
-
select选择的字段不能包含非索引字段
-
sql中不能带group by或者distinct语法
-
Skip scan 仅支持单表查询,多表关联是无法使用该特性。
-
对于组合索引([A_1..A_k,] B_1...B_m,C[, D_1, ....D_n]),A,D 可以为空,但是B ,C字段不能为空。
这篇关于索引下推和索引跳跃的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!