Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MYSQL Skip Scan Range 小功能,解决大问题 ?

MYSQL Skip Scan Range 小功能,解决大问题 ?

作者头像
AustinDatabases
发布于 2019-12-12 14:40:58
发布于 2019-12-12 14:40:58
69200
代码可运行
举报
文章被收录于专栏:AustinDatabasesAustinDatabases
运行总次数:0
代码可运行

用过MYSQL的都会被别的数据库的operation 吐槽,索引的建立与使用方面的需要掌握的知识是比较“矫情的”。为什么这么说,在MYSQL 5.X中如果一个表中 有这样的索引,和这样的查询,索引的效率就会大打折扣。

我们来看一下,根据官方的文档我们创建下面的数据

请准备MYSQL 8.013以上版本 以及 MYSQL 5.7 版本的两台机器,并执行下面的操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE t1 (f1 INT NOT NULL, f2 INT NOT NULL, PRIMARY KEY(f1, f2));
INSERT INTO t1 VALUES
  (1,1), (1,2), (1,3), (1,4), (1,5),
  (2,1), (2,2), (2,3), (2,4), (2,5);
INSERT INTO t1 SELECT f1, f2 + 5 FROM t1;
INSERT INTO t1 SELECT f1, f2 + 10 FROM t1;
INSERT INTO t1 SELECT f1, f2 + 20 FROM t1;
INSERT INTO t1 SELECT f1, f2 + 40 FROM t1;
ANALYZE TABLE t1;

EXPLAIN SELECT f1, f2 FROM t1 WHERE f2 > 40;

set session optimizer_trace=’enabled=on';

然后我们通过optimizer_trace 来查看这两个服务器上查询上面的给出的分析结果

下面的图形仅仅只给出不同的截图(具体 optimize_trace 之前有文字写过,这里就不赘述了)

代码语言:javascript
代码运行次数:0
运行
复制

1 MYSQL 5.7 的 row_estimation ,我看可以看到很简单

2 下面是MYSQL 8.017 的图,从下图看,明显的MYSQL 8 在查询计划的分析要比 MYSQL 5.7 复杂的多,其中第二张图已经显示走了skip_scan

既然看到不同,但问题是这样有什么用,首先如果是MYSQL 5.7 上基本上走的是 INDEX Scan 而, 而在MYSQL 8 上做的事情要远远多于 MYSQL5.7 从上图可以看出,首先查询先将索引中的前边的字段,进行了group by 的操作,将需要进行扫描的数据通过第一个字段划分了块,然后在每个块中扫描range 的数据。

这样的好处也是显而易见的,如果将数据扫描进行分块处理,有些不包含range 的数据块将不被扫描,或者不包含range 的行也将不被扫描。

这项功能也是有一定要求的

1 必须单表

2 不能有group distinct 的操作

3 索引两边的字段都可以包含NULL ,但中间的字段不可以有NULL

下面在做一个测试确认一下前边有两个字段的情况下,是不是也是可以走skip scan index

CREATE TABLE t2 (f1 INT NOT NULL, f2 INT NOT NULL,f3 int not null);

INSERT INTO t2 VALUES

(1,1,2), (1,2,3), (1,3,4), (1,4,5), (1,5,6),

(2,1,3), (2,2,4), (2,3,6), (2,4,2), (2,5,4);

INSERT INTO t2 SELECT f1, f2 + 5,f3 + 2 FROM t2;

INSERT INTO t2 SELECT f1, f2 + 10,f3 + 4 FROM t2;

INSERT INTO t2 SELECT f1, f2 + 20, f3 + 5 FROM t2;

INSERT INTO t2 SELECT f1, f2 + 4, f3 + 6 FROM t2;

ANALYZE TABLE t1;

create index ix_t2_f2_f3 on t2 (f1,f2,f3);

最终的结果还是可以走的,其实可以理解为,前边将两个没有条件的字段都变为有具体值的条件匹配后面的字段的范围查询。这个做法在ORACLE 早就是有的功能,目前MYSQL 也继承了这个功能。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL 8.0 之Index Skip Scan
MySQL 8.0.13开始支持 index skip scan 也即索引跳跃扫描。该优化方式支持那些SQL在不符合组合索引最左前缀的原则的情况,优化器依然能组使用组合索引。
用户1278550
2020/06/10
2.7K1
mysql8.0性能_oracle scan ip
MySQL从8.0.13版本开始支持一种新的range scan方式,称为Loose Skip Scan。该特性由Facebook贡献。我们知道在之前的版本中,如果要使用到索引进行扫描,条件必须满足索引前缀列,比如索引idx(col1,col2), 如果where条件只包含col2的话,是无法有效的使用idx的, 它需要扫描索引上所有的行,然后再根据col2上的条件过滤。
全栈程序员站长
2022/08/04
5870
cost量化分析
我们在日常维护数据库的时候,经常会遇到查询慢的语句,这时候一般会通过执行EXPLAIN去查看它的执行计划,但是执行计划往往只给我们带来了最基础的分析信息,比如是否有使用索引,还有一些其他供我们分析的信息,比如使用了临时表、排序等等,却无法展示为什么一些其他的执行计划未被选择,比如说明明有索引,或者好几个索引,但是为什么查询时未使用到期望的索引等
GreatSQL社区
2023/08/10
3440
cost量化分析
Mysql范围查询优化
Equality Range Optimization of Many-Valued Comparisons
mingjie
2022/05/12
2.3K0
你们一般都是怎么进行SQL调优的?MySQL在执行时是如何选择索引的?
过年回来的第二周了,终于有时间继续总结知识了。这次来看一下SQL调优的知识,这类问题基本上面试的时候都会被问到,无论你的岗位是后端,运维,测试等等。 像本文标题中的两个问题,就是我在实际面试过程中遇到的,所以这次就主要围绕着这两个问题来总结一下。
纪莫
2021/03/04
9620
你们一般都是怎么进行SQL调优的?MySQL在执行时是如何选择索引的?
MySQL8.0 优化器介绍(一)
线上,遇到一些sql性能问题,需要手术刀级别的调优。optimizer_trace是一个极好的工具,已经有很多资料介绍optimizer_trace怎么使用与阅读。有必要再介绍一下我们平时不太能注意到,但是又对sql性能起着绝对作用的优化器。
GreatSQL社区
2023/08/10
4130
MySQL8.0 优化器介绍(一)
故障分析 | 从一个死锁问题分析优化器特性
作者:李锡超,一个爱笑的江苏苏宁银行 数据库工程师,主要负责数据库日常运维、自动化建设、DMP 平台运维。擅长 MySQL、Python、Oracle,爱好骑行、研究技术。
爱可生开源社区
2023/09/20
2850
故障分析 | 从一个死锁问题分析优化器特性
MySQL 直方图介绍
MySQL 8.0.19 开始支持对InnoDB引擎表数据进行采样以生成直方图统计信息。
GreatSQL社区
2022/04/26
5860
MySQL 最新的release notes
从MySQL发布正式版本8.0.11以来,MySQL 又相继发布8.0.12-8.0.15 四个版本.本文着重介绍8.0.13和8.0.14 版本中值得关注的改进点。
用户1278550
2019/05/07
9930
MySQL 最新的release notes
什么是最左前缀匹配?为什么要遵守?
在 MySQL 中,最左前缀匹配指的是在查询时利用索引的最左边部分进行匹配。当你执行查询时,如果查询条件涉及到组合索引的前几个列,MySQL 就能够利用该复合索引来进行匹配。
@派大星
2024/05/29
7960
什么是最左前缀匹配?为什么要遵守?
MySQL 8.0之hash join
首先对于熟悉Oracle 的DBA 来说,hash join并不陌生,尤其涉及到多个表join时 执行计划出现 hash join ,一般来说hash join的执行效率是比 Nest Loop 要好。运维MySQL 之后DBA也对MySQL 提出支持hash join的诉求。MySQL 在8.0.18 版本终于支持hash join了。那么什么是hash join呢?
用户1278550
2020/08/21
3.7K0
《MySQL开发规范》过时了,视图的查询性能提升了一万倍
视图在数据库中是非常普及的功能。但是长期以来,大多数互联网公司的《MySQL开发规范》中都有一条规范:在MySQL中禁止(或建议不要)使用视图。究其原因,主要是由于在MySQL中视图的查询性能不好,同时带来了管理维护上的高成本。 不过随着MySQL 8.0中派生条件下推特性的引入,尤其是最近GA的MySQL 8.0.29版本中对于包含union子句的派生条件下推优化,MySQL中视图查询的性能得到了质的提升。 《MySQL开发规范》已经过时了,DBA该考虑考虑将禁止使用视图的规定重新修订一下了。
吹水老王
2022/05/17
7.1K1
mysql性能优化
InnoDb索引文件和数据文件是在一起的,只要查找索引文件后就可以连接到数据文件,查一次即可,效率高。现在主流使用InnoDb引擎
编程软文
2021/10/09
1.1K0
MySQL索引(五)索引优化分析工具
Trace 是 MySQL 5.6 版本后提供的 SQL 跟踪工具,用于了解优化器 (optimizer) 在选择执行计划时的决策过程,包括表访问方法、各种开销计算和转换等信息。
鳄鱼儿
2024/05/21
1370
MySQL索引(五)索引优化分析工具
这个 MySQL bug 99% 的人会踩坑!
执行show create table order_info 发现这个表其实是有加索引的
kunge
2021/09/28
8480
要不要走索引?MySQL 的成本分析
谈到索引失效,大家可能都能列举出几个场景,比如:后模糊查询、条件中带函数、索引中断等等。今天我想和你分享另一个场景:索引成本分析。
杨同学technotes
2022/12/01
5700
第 47 期:EXPLAIN TYPE 列的 JOIN 常见场景详解(上)
对于关系型数据库来说,表的设计 以及 SQL 的写法 尤为重要,占据性能的 90% 都不为过,所以这次专门针对这两大类知识领域,为您抽丝剥茧详细分析。
爱可生开源社区
2024/12/27
1040
第 47 期:EXPLAIN TYPE 列的 JOIN 常见场景详解(上)
真的坑,这个 MySQL 的 bug 99% 的人会踩!
执行show create table order_info发现这个表其实是有加索引的
终码一生
2022/04/15
6860
真的坑,这个 MySQL 的 bug 99% 的人会踩!
你知道MySQL 8.0中的索引有哪些新特性吗?看这一篇就够了!!!
在之前MySQL的版本中,只能通过显式的方式删除索引,如果删除后发现索引删错了,又只能通过创建索引的方式将删除的索引添加回来,如果数据库中的数据量非常大,或者表比较大,这种操作的成本非常高。在MySQL 8.0中,只需要将这个索引先设置为隐藏索引,使查询优化器不再使用这个索引,但是,此时这个索引还是需要MySQL后台进行维护,当确认将这个索引设置为隐藏索引系统不会受到影响时,再将索引彻底删除。这就是软删除功能。
冰河
2020/10/29
1.2K0
你知道MySQL 8.0中的索引有哪些新特性吗?看这一篇就够了!!!
06期:使用 OPTIMIZER_TRACE 窥探 MySQL 索引选择的秘密
这里记录的是学习分享内容,文章维护在 Github:studeyang/leanrning-share。
杨同学technotes
2023/04/21
1.4K0
06期:使用 OPTIMIZER_TRACE 窥探 MySQL 索引选择的秘密
相关推荐
MySQL 8.0 之Index Skip Scan
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验