侧边栏壁纸
博主头像
Terry

『LESSON 5』

  • 累计撰写 90 篇文章
  • 累计创建 21 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

MySQL索引跳跃式扫描

Terry
2020-08-30 / 0 评论 / 0 点赞 / 620 阅读 / 773 字 / 正在检测是否收录...

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后数量太多,可以考虑在非最左的列上建立一个索引
0

评论区