0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

offset新探索:双管齐下,加速大数据量查询

IT科技苏辞 来源:IT科技苏辞 作者:IT科技苏辞 2022-11-24 14:45 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

offset新探索:双管齐下,加速大数据量查询

众所周知,在各类业务中时常会用到LIMIT y offset x来做跳过x条数据读取Y条数据的操作。例如:SELECT * FROM ... LIMIT 1000 OFFSET 1000000;表示从第1000001条数据开始查,读取1000条数据。随着offset的增加,查询的时长也会越来越长。当offset达到百万级别的时候查询时长有可能秒级,这是业务所不能容忍的。

那么如何来提升offset在大数据量查询时的性能、缩短执行时间呢?我们的答案是:

offset Pushdown( offset下推,下文简称OP)

Redundant Condition Removal (冗余条件删除,下文简称 RCR)

这是华为云GaussDB for MySQL推出的两个新特性,通过OP和RCR的结合,将大数据量查询的性能提升一到两个数量级。下面我们分别介绍这两个特性的基本原理、如何启用、执行验证、以及通过严密测试来验证其带来的性能提升。

Offset Pushdown -- OP

OP赋予MySQL存储引擎InnoDB处理offset的能力。当OP启用时,在SQL层评估offset是否可以下推并将下推信息传递给存储引擎。SQL层不再对存储引擎返回的行进行offset处理,取而代之的是存储引擎层直接跳过offset范围内的行,仅返回后续行,即查询所需要的行。

通过启用OP,offset范围内的行不会再传输到SQL层,从而节省了存储引擎和SQL层之间多次来回交互时间;其次,对非覆盖索引扫描(non-covering index,即查询访问二级索引之后,还必须访问基表),直接跳过offset范围内的行可以节省对这些行回表访问的开销。这种对offset的提前处理可以节省数据处理时间,特别是当offset非常大时。OP的适用性取决于WHERE子句是否可以由存储引擎整体处理。

下方图1和2分别说明了在没有OP和启用OP时LIMIT offset的处理逻辑。

pYYBAGN_Ew2ARTElAACl7e-leQ4309.png

图1无OP的极限偏移逻辑

pYYBAGN_EwaACm3XAACXNSgo0Xg775.png

图2启用OP的LIMIT offset逻辑

Redundant Condition Removal – RCR

RCR的思路也比较简单:当进行索引范围扫描时,SQL层对存储引擎返回的行执行冗余检查,因为它不知道存储引擎已经执行了这些检查,而RCR就是让 SQL层了解这点。为了使 OP成为可能,除了要求WHERE条件能够被存储引擎独立且完整的评估,SQL层还必须了解这点从而避免冗余检查。

OP功能的实现方式与索引条件下推 (Index Condition Pushdown,ICP) 类似。对于某些查询,ICP通过将整个 WHERE子句下推到存储引擎来启用 OP。而RCR在 ICP执行之前会评估条件是否冗余,并且移除冗余条件,确保了ICP不会处理冗余的条件检查。RCR很好地补充了OP特性的适用范围,允许更多查询使用 OP。

请注意:OP的启用需要满足三个主要条件:

SQL语句包含offset

WHERE子句完全由InnoDB处理

SQL语句只涉及一张表

另外,

查询中使用的表必须是InnoDB表

不使用HAVING, aggregations, GROUP BY, SELECT DISTINCT, ROLLUP,Window functions以及文件排序

不支持涉及多个分区的分区表查询,只涉及单个分区的可以

RCR适用于索引范围扫描,如果WHERE子句中出现了一个或者多个条件,而这些条件涉及到的字段在对应使用的索引上是被连续定义的,这些条件的冗余检查就都会被移除。

如何启用OP?

方法一:使用特定的optimizer switch:offset _PUSHDOWN

set optimizer_switch='OFFSET_PUSHDOWN=[on]/[off]';

默认为打开。

方法二:使用特定的优化器hint:[NO]_OFFSET_PUSHDOWN()

SELECT /*+ [NO]_OFFSET_PUSHDOWN() */ FROM TABLE LIMIT n OFFSET p;

请注意,hint优先级高于optimizer switch的设置。

我们基于下方创建的t1表,来举例说明如何使用OP:

CREATE TABLE t1 (a int, b int, INDEX (b));

示例一:表扫描

explain format=tree select * from t1 limit 100 offset 1;

+----------------------------------------------------------------------------------------------------------------------+

| EXPLAIN |

+----------------------------------------------------------------------------------------------------------------------+

| -> Limit/Offset: 100/1 row(s), with offset pushdown (cost=0.65 rows=4)

-> Table scan on t1 (cost=0.65 rows=4)

|

+----------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

示例二:二级索引上的索引范围扫描

explain format=tree select a,b from t1 where b>2 limit 100 offset 1;

+------------------------------------------------------------------------------------------------------------------------------------+

| EXPLAIN |

+------------------------------------------------------------------------------------------------------------------------------------+

| -> Limit/Offset: 100/1 row(s), with offset pushdown (cost=1.61 rows=3)

-> Index range scan on t1 using b (cost=1.61 rows=3)

|

+------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

如何启用RCR?

通过系统变量rds_empty_redundant_check_in_range_scan设置,如下:

set rds_empty_redundant_check_in_range_scan=[true]/[false];

默认为true。

我们通过一个示例来说明:

创建t0表:

CREATE TABLE t0 (a int, b int, INDEX (a,b));

不启用RCR:

explain format=tree select * from t0 where a<100 and a>20 LIMIT 1 OFFSET 100;

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| EXPLAIN |

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| -> Limit/Offset: 1/100 row(s) (cost=0.46 rows=1)

-> Filter: ((t0.a < 100) and (t0.a > 20)) (cost=0.46 rows=1)

-> Index range scan on t0 using a (cost=0.46 rows=1)

|

+---------------------------

可以看出:列a上的范围条件会被InnoDB默认检查,但SQL层将再次检查InnoDB返回的行是否匹配列a的范围条件。在这种情况下,无法使用OP,因为SQL层不知道存储引擎实际上处理了整个WHERE子句。

启用RCR:设定rds_empty_redundant_check_in_range_scan = true;

explain format=tree select * from t0 where a<100 and a>20 LIMIT 1 OFFSET 100;

+------------------------------------------------------------------------------------------------------------------------------------+

| EXPLAIN |

+------------------------------------------------------------------------------------------------------------------------------------+

| -> Limit/Offset: 1/100 row(s), with offset pushdown (cost=0.46 rows=1)

-> Index range scan on t0 using a (cost=0.46 rows=1)

|

+------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

可以看出:启用RCR,删除SQL层对列A的范围条件的冗余检查后,启用OP。

简化ICP:

创建表t1:

create table t1(a int, b int, INDEX(b));

不启用RCR:

explain format=tree select a,b from t1 where b>2 limit 100 offset 1;

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| EXPLAIN |

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| -> Limit/Offset: 100/1 row(s), with offset pushdown (cost=1.61 rows=3)

-> Index range scan on t1 using b, with index condition: (t1.b > 2) (cost=1.61 rows=3)

|

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

可以看出:使用了ICP后,OP也被启用了

启用RCR:

explain format=tree select a,b from t1 where b>2 limit 100 offset 1;

+------------------------------------------------------------------------------------------------------------------------------------+

| EXPLAIN |

+------------------------------------------------------------------------------------------------------------------------------------+

| -> Limit/Offset: 100/1 row(s), with offset pushdown (cost=1.61 rows=3)

-> Index range scan on t1 using b (cost=1.61 rows=3)

|

+------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

以上示例说明:ICP不是必要的。通过评估是否应使用ICP之前移除冗余条件,就可以避免使用ICP。

性能验证:

下面我们通过实际测试来验证OP所带来的性能提升。在测试中,我们重点关注:

覆盖/非覆盖索引

考虑一个非覆盖索引,不使用OP,InnoDB必须从基表读取行,然后才能将它们返回到SQL层。使用OP后,就可以跳过行,而不必从基表读取。因此,OP在非覆盖索引上可以提供更好的性能。

热/冷缓冲池

我们希望通过热缓冲池全面提高性能,但我们也希望OP在热缓冲池上相对更高效,原因如下:

基于一个冷缓冲池并且查询使用覆盖索引扫描的场景,设定

)和使用OP的计算时间(

)的比值:

比值

预计将大于1,因为使用OP将获得性能提升。基于一个热缓冲池并且查询使用覆盖索引扫描的场景,设定

是不使用OP的计算时间(

和使用OP的计算时间(

的比值:

其中

表示从磁盘读取索引所需的时间,可以合理地假设,在使用OP和不使用OP的情况下,

都是相同的。因为不论是否使用OP,都必须从左到右遍历索引,无法在使用OP的情况下,利用B-tree结构索引的优势直接跳转到offset范围的结束点。

那么,这两个比值的差值可以表述为:

因此,我们预计OP在热缓冲池将更有效。

缓冲池大小

对于覆盖索引查询,可以假定索引数据都在缓冲池中,因此,缓冲池的大小对性能不会产生太大影响。然而,对于非覆盖索引的查询,情况会大不相同。在不使用OP时,缓冲池能缓存表数据的比例确实会对查询的性能产生有利的影响。

基于以上三个关注点以及预判,我们在一个包含200万行数据的测试表中,分别测试覆盖/非覆盖索引、冷/热缓冲池、不同缓冲池大小下条件下,通过OP带来的性能表现。

测试语句:

覆盖索引查询:

CREATE TABLE data (id int, value int, INDEX (id,value));

SELECT * FROM data LIMIT 1 OFFSET p;

非覆盖索引查询:

CREATE TABLE data_non_covering(id INT, value INT, INDEX (value));

INSERT INTO data_non_covering SELECT * FROM data;

SELECT * FROM data_non_covering WHERE value>2 LIMIT 1 OFFSET p;

为了过滤干扰,计算时间是取9次运行结果的中位数。

pYYBAGN_Et2ARg-FAABUo7BeVtk933.png

通过以上测试结果可以看出:

热缓冲池,并将其大小设为128MB

使用覆盖索引,OP可以将查询性能提升3 – 12倍;

使用非覆盖索引,OP可以将查询性能提升 48 – 128倍

冷缓冲池,并将其大小设定为128MB:

使用覆盖索引,OP可以将性能提升 40% - 8倍;

使用非覆盖索引,OP可以将性能提升2 - 148倍

综上,在所有测试中,使用OP能提升查询性能。不论是冷缓冲池还是热缓冲池,启用OP后,非覆盖索引扫描可以比覆盖索引扫描获得10倍以上的性能提升。此外,正如我们所预计,在热缓冲池上启用OP获得了更大的性能提升。

对于大的OFFSET,使用OP可将性能提高一两个数量级,而RCR可扩大了OP的适用范围。正如上述测试所证明,使用OP所带来的性能提升主要受下面两个因素的影响:

OP可以在存储引擎层跳过offset行,而不必将它们返回到SQL层,这将导致计算时间的显著降低。

OP可以跳过offset行,而不必从基表读取它们,从而获得性能提升。

而OP和RCR的联合使用,进一步扩大了OP的使用范围,可以为更多的Limit/offset查询带来性能提升,尤其是对大的offset操作。

在后续的研究中,我们将会评估OP与NDP(Near Data Processing, 近数据处理)的兼容性以及潜在的性能改进。

本文作者

吕漫漪

现任华为瑞典研究所数据库Lab首席科学家,云数据库欧洲研发团队的负责人。在数据库领域有20多年经验,曾经参与开发电信行业分布式高可用数据库,在国际知名软件公司深耕了十年MySQL技术。2020年加入华为,立志于打造世界顶端的企业级云数据库。

Maxime Conjard

华为云数据库工程师,就职于华为云数据库欧洲研发团队。Max毕业于挪威科技大学(NTNU),获得统计学硕士和博士学位;在此之前,他在法国马赛中央学院获得工程硕士学位。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据库
    +关注

    关注

    7

    文章

    3993

    浏览量

    67736
  • 大数据
    +关注

    关注

    64

    文章

    9029

    浏览量

    143064
  • 华为云
    +关注

    关注

    3

    文章

    2804

    浏览量

    19090
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    淘宝/天猫:使用物流查询API实时显示包裹位置,减少客服咨询

    ​  引言 在电商平台的日常运营中,物流咨询往往占据客服工作的40%以上。买家频繁询问"我的包裹到哪里了?"不仅增加客服压力,还影响用户体验。本文将介绍如何通过 物流查询API 实时显示包裹位置
    的头像 发表于 09-22 14:34 330次阅读
    淘宝/天猫:使用物流<b class='flag-5'>查询</b>API实时显示包裹位置,减少客服咨询<b class='flag-5'>量</b>

    光庭信息出席中国车企欧洲市场新探索圆桌沙龙

    近日,在慕尼黑国际车展期间,由亚马逊云科技联合中国电动汽车百人会车百智库主办的“中国车企欧洲市场新探索圆桌沙龙”成功举行。活动汇聚了全球知名汽车企业高管、行业专家、技术专家以及中国智能供应链企业代表
    的头像 发表于 09-16 17:58 935次阅读

    中科创达出席中国车企欧洲市场新探索圆桌沙龙

    2025年9月10日,亚马逊云科技携手车百智库在IAA MOBILITY 2025上特别策划 “中国车企欧洲市场新探索圆桌沙龙”,聚焦中国新能源汽车企业在欧洲市场的发展机遇与挑战。中科创达联合创始人
    的头像 发表于 09-16 09:48 750次阅读

    工具 + 技巧双管齐下,BNC连接器快速安装秘籍大公开

    保护连接:使用电工胶带或热缩管覆盖连接部位,防止水分、灰尘侵入,增强连接部位的稳定性与耐用性。 掌握上述德索工具的使用及安装技巧,您就能高效、准确地完成BNC连接器的安装工作,保障信号稳定传输。
    的头像 发表于 08-12 13:57 452次阅读
    工具 + 技巧<b class='flag-5'>双管齐下</b>,BNC连接器快速安装秘籍大公开

    预警 + 定位双管齐下!配网行波故障预警与定位装置让故障隐患无处遁形

    特力康TLKS-PMG-DSCD配网隐患预警及精确定位系统 在电力供应体系中,配网线路作为连接主电网与用户的 “最后一公里”,其稳定运行至关重要。然而,线路故障却如同隐藏的 “定时炸弹”,一旦发生,不仅会导致停电,影响居民生活与企业生产,还可能因故障排查耗时过长,造成难以估量的经济损失。传统故障定位手段效率低、误差大的问题,成为电力运维人员亟待解决的难题。TLKS-PMG-DSCD配网隐患预警及精确定位系统的出现,为这一困境带来了全新的
    的头像 发表于 06-13 10:52 496次阅读
    预警 + 定位<b class='flag-5'>双管齐下</b>!配网行波故障预警与定位装置让故障隐患无处遁形

    cypress3014怎么查看USB走线每帧传输的图像数据量

    你好,请问怎么查看USB 走线每帧传输的图像数据量
    发表于 05-14 06:12

    EXR小故事 – 双脉冲测试双管齐下

    关键词:双脉冲测试,上管测试,下管测试,电源完整性测试套件宽禁带半导体作为第三代半导体功率器件的代表,正在电源处理领域发挥着日益重要的作用。这类材料凭借其高能量密度、高工作频率以及耐高温等天然优势,成为了众多电源及电源模块的首选材料。特别是在功率半导体中,上下管双脉冲测试已经成为评估动态参数的经典方法,对于推动相关技术的发展具有重要意义。那么,何为双脉冲测试
    的头像 发表于 04-11 15:00 720次阅读
    EXR小故事 – 双脉冲测试<b class='flag-5'>双管齐下</b>

    STM32F429以太网外设数据处理上限是多少?

    无法通信-通信延时-通信恢复,wireshark数据暂未获取到。 请帮忙分析以上现象是否为429的MAC核无法支持大数据量的冲刷,即使MAC过滤减轻了应用层的压力,在MAC硬件层仍会造成拥塞或某种溢出。谢谢
    发表于 03-13 06:52

    【解码CITE2025】全球数字化变局中的&quot;中国突围&quot;:本土科技巨头如何重构产业新生态

    与技术双轮驱动的繁荣格局。 随着数据量指数级增长,全球大数据存储市场呈现出迅猛的扩张态势,物联网设备的广泛普及、AI训练对海量数据的需求以及企业数字化转型的加速,全球
    发表于 03-10 15:06 352次阅读
    【解码CITE2025】全球数字化变局中的&quot;中国突围&quot;:本土科技巨头如何重构产业新生态

    RAM容量不足导致的数据溢出如何预防和处理?

    在 STM32F411 中,RAM 容量是有限的,特别是在进行复杂的数据处理和存储时,可能会遇到数据溢出问题。数据溢出是指程序运行时,数据超出了 RAM 的分配区域,导致程序崩溃或
    发表于 03-07 16:09

    HAL库SPI DMA批量传输数据量最大为2^16,有没有办法改成上限为2^32?

    HAL库SPI DMA批量传输数据量最大为2^16,有没有办法改成上限为2^32
    发表于 03-07 13:02

    双管正激实际分析

    1双管正激变换器的实际工作原理 双管正激变换器的拓朴结构如图1所示,其中Cin为输入直流滤波电解电容,01和02为主功率开关管,D1、D2和C1、C2分别为Q1和Q2的内部寄生的反并联二极管和电容
    发表于 03-05 15:19

    调试16位adc芯片ads8328时转换后的数据波动100个数据量转换后的数据有波动,而且测量值比理论值小,为什么?

    调试16位adc芯片ads8328时转换后的数据波动100个数据量转换后的数据有波动,而且测量值比理论值小。输入电压使用安捷伦的数字电压源给的,基准时REF3120,2.048V的,都是TI的产品,以下是我的硬件电路和测量的
    发表于 01-24 06:52

    系统要求20微秒采集一次数据,每次数据量4.8Kb,总的速率为240Mbps,ADC0XD1520RB评估板能否满足需求?

    有几个问题请教各位专家: 1、我的系统要求20微秒采集一次数据(单通道模式3Gsps),每次数据量4.8Kb,总的速率为240Mbps,ADC0XD1520RB这个评估板能否满足需求。缓冲容量
    发表于 12-26 07:43

    缓存对大数据处理的影响分析

    缓存对大数据处理的影响显著且重要,主要体现在以下几个方面: 一、提高数据访问速度 在大数据环境中,数据存储通常采用分布式存储系统,数据量庞大
    的头像 发表于 12-18 09:45 1108次阅读