前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >新特性解读 | MySQL 8.0 索引特性2-索引跳跃扫描

新特性解读 | MySQL 8.0 索引特性2-索引跳跃扫描

作者头像
田帅萌
发布2019-05-28 16:49:13
1.5K0
发布2019-05-28 16:49:13
举报
文章被收录于专栏:「3306 Pai」社区「3306 Pai」社区

MySQL 8.0 实现了Index skip scan,翻译过来就是索引跳跃扫描。熟悉ORACLE的朋友是不是发现越来越像ORACLE了?再者,熟悉MySQL 5.7 的朋友是不是觉得这个很类似当时优化器的选项MRR?好了,先具体说下什么 ISS,我后面全部用 ISS 简称。

*考虑以下的场景:

表t1有一个联合索引idx_u1(rank1,rank2),但是查询的时候却没有rank1这列,只有rank2。比如,select * from t1 where rank2 = 30。

那以前遇到这样的情况,如果没有针对rank2这列单独建立普通索引,这条SQL怎么着都是走的FULL TABLE SCAN。

ISS 就是在这样的场景下产生的。ISS 可以在查询过滤组合索引不包括最左列的情况下,走索引扫描,而不必要单独建立额外的索引。因为毕竟额外的索引对写开销很大,能省则省。

还是拿刚才的例子来讲,假设:

表t1的两个字段rank1,rank2。有这样的记录,

我们给出的SQL是,

select * from t1 where rank2 >400,

那MySQL通过ISS把这条SQL变为,

select * from t1 where rank1=1 and rank2 > 400union allselect * from t1 where rank1 = 5 and rank2 > 400;

可以看出来,MySQL其实内部自己把左边的列做了一次DISTINCT,完了加进去。

我们拿实际的例子来看下。假设:

还是刚才描述那张表,rank1字段值的distinct值比较少。查询计划的对比,

关闭 ISS,

很显然,ISS 扫描的行数要比之前的少很多。

ISS其实恰好适合在这种左边字段的唯一值较少的情况下,效率来的高。比如性别,状态等等。

那假设:rank1字段的distinct值比较多呢?

我们重新造了点数据,这次,rank1的唯一值个数有快上万个。

我们来再次看一遍这样SQL的执行计划,

这次我们发现,无论如何MySQL也不会选择 ISS,而选了FULL INDEX SCAN。

那这样的场景就必须给rank2加一个单独索引了。

那来总结下 ISS 就是一句话:ISS 其实就是MySQL 8.0推出的适合联合索引左边列唯一值较少的情况的一种优化策略。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 3306pai 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档