MySQL索引跳跃式扫描
此特性是MySQL8.0版本才实现的.ORACEL本身带有此特性
索引跳跃式扫描(INDEX SKIP SCAN)适用于所有类型的复合B树索引(包括唯一性索引和非唯一性索引),它使那些在where条件中没有对目标索引的前导列指定查询条件但同时又对该 索引的非前导列指定了查询条件的目标SQL依然可以用上该索引,这就像是在扫描该索引时跳过了它的前导列,直接从该索引的非前导列开始扫描一样(实际的执行过程并非如此),这也是索引跳跃式扫描中”跳跃”(SKIP)一词的含义。
例子
# 此处省略生成数据库等操作,复合索引为(a,b)
select * from table where b = 1
此SQL就会用到索引跳跃式扫描,explain后Extra为:Using where;Using index for skip scan(表使用到索引跳跃式扫描).
其实是MySQL通过此特性,把SQL转化为:
select * from table where a = 1 and b = 2
union all
select * from table where a = 2 and b = 2
...等所有distinct a
由上面可以看出为了避免全表扫描,提高查询速度,MySQL其实内部自己把最左的列做了一次distinct,然后通过union all组合起来.这是MySQL优化器决定的,优化器会根据distinct a的数量来决定是否使用此特性.所以注意以下几点:
- 如果最左的列distinct后数量太多的话,无乱如何MySQL不会选择索引跳跃式扫描,而选了全表扫描.
- 如果最左的列distinct后数量太多,可以考虑在非最左的列上建立一个索引
评论区