GaussDB(for MySQL)并行查询

GaussDB(for MySQL)并行查询(PQ)

云数据库GaussDB(for MySQL)支持了并行执行的查询方式,用以降低分析型查询场景的处理时间,满足企业级应用对查询低时延的要求。并行查询的基本实现原理是将查询任务进行切分并分发到多个CPU核上进行计算,充分利用cpu的多核计算资源来缩短查询时间。并行查询的性能提升倍数理论上与CPU的核数正相关,也就是说并行度越高能够使用的CPU核数就越多,性能提升的倍数也就越高。

下图是使用CPU多核资源并行计算一个表的count(*)过程的基本原理:表数据进行切块后分发给多个核进行并行计算,每个核计算部分数据得到一个中间count(*)结果,并在最后阶段将所有中间结果进行聚合得到最终结果。具体如下:


前提条件

云数据库GaussDB(for MySQL)的引擎版本为MySQL 8.0.22及以上。

应用场景

并行查询适用于大部分SELECT语句,例如大表查询、多表连接查询、计算量较大的查询。对于非常短的查询,效果不太显著。

轻分析类业务

报表查询通常SQL复杂而且比较耗费时间,通过并行查询可以加速单次查询效率。

系统资源相对空闲

并行查询会使用更多的系统资源,只有当系统的CPU较多、IO负载不高、内存够大的时候,才可以充分使用并行查询来提高资源利用率和查询效率。

数据频繁查询

针对数据密集型查询,通过并行查询,可以提高查询处理执行效率,减少网络流量和计算节点的压力。

说明:并行查询特性当前处于公测阶段,建议在测试环境使用。

GaussDB(for MySQL)并行查询特性支持场景

并行查询支持场景

并行查询支持以下场景:

1、支持全表扫描、索引扫描、索引范围扫描、索引逆序扫描、索引点查询、索引下推等。

2、支持单表查询、多表JOIN、视图view、子查询,部分CTE查询等。

3、支持多种JOIN算法,包括:BNL Join、BKA Join、HASH Join、Nested loop Join、Semi Join、Anti Join、outer Join等。

4、支持多种子查询,包括:条件子查询、scalar子查询、部分关联子查询、非关联子查询、derived table等。

5、支持多种数据类型,包括:整型数据、字符型数据、浮点型数据、时间型数据等。

6、支持算术表达式计算(+、-、*、%、/、|、&),条件表达式运算(<、<=、>、>=、<>、between/and、In等),逻辑运算(or、and、not等),一般函数(字符函数、整型函数、时间函数等),聚合函数(count/sum/avg/min/max)等等。

说明:count聚合函数需关闭innodb_parallel_select_count才能并行执行。

7、支持非分区表查询、分区表单分区查询。

8、支持排序order by、分组group by/distinct、分页limit/offset、过滤where/having、列投影等。

9、支持UNION/UNION ALL查询。

10、支持Explain查看并行执行计划多种方式,包括传统Explain、Explain format=tree、Explain format=json等。

GaussDB(for MySQL)开启/关闭并行查询

方法一:通过设置系统参数开启/关闭并行查询

在管理控制台的参数修改页面,通过设置系统参数,开启和关闭并行查询,并设置并行度。

通过全局参数force_parallel_execute来控制是否强制启用并行执行;

使用全局参数parallel_default_dop来控制使用多少线程并行执行;

使用全局参数parallel_cost_threshold来控制当执行代价为多大时,开启并行执行。

上述参数在使用过程中,随时可以修改,无需重启数据库。

例如,想要强制开启并行执行,并且并发度为4,最小执行代价为0,可参照如下进行设置:

SET force_parallel_execute=ON

SET parallel_default_dop=4

SET parallel_cost_threshold=0

方法二:使用hint开闭/关闭并行查询

使用hint语法可以控制单个语句是否进行并行执行。在系统默认关闭并行执行的情况下, 可以使用hint对特定的SQL进行开启。反之,也可以禁止某条SQL进行并行执行。

开启并行执行:采用下面的hint语法可以开启并行执行。

采用默认的参数配置:SELECT /*+ PQ() */ … FROM …

采用默认的参数配置,同时指定并发度为8:SELECT /*+ PQ(8) */ … FROM …

采用默认的参数配置,同时指定并行表为t1:SELECT /*+ PQ(t1) */ … FROM …

采用默认的参数配置,同时指定并行表为t1,并发度为8:SELECT /*+ PQ(t1 8) */ … FROM …

说明:并行查询PQ hint紧跟着SELECT关键字才能生效。PQ hint的并发度参数dop正常取值范围[1, min(parallel_max_threads, 1024)]。

dop超出正常取值范围时,并行查询PQ不生效。

关闭并行执行:当并行查询开启时,可使用"NO_PQ"的hint语法关闭单条SQL的并行执行。

SELECT /*+ NO_PQ */ … FROM …

云数据库GaussDB(for MySQL)常见问题解答

云数据库GaussDB(for MySQL)常见问题解答

  • GaussDB(for MySQL)算子下推特性是什么?

    NDP(Near Data Processing)是云数据库GaussDB(for MySQL)发布的旨在提高数据查询效率的计算下推的解决方案。针对数据密集型查询,将提取列、聚合运算、条件过滤等操作从计算节点向下推送给GaussDB(for MySQL)的分布式存储层的多个节点,并行执行。通过计算下推方法,提升了并行处理能力,减少网络流量和计算节点的压力,提高了查询处理执行效率。

    架构

    云数据库GaussDB(for MySQL)采用计算与存储分离的架构,以减少网络流量为主要架构准则,通过NDP设计将该准则应用到查询操作。没有NDP之前,查询处理需要将原始数据从存储节点全部传输到计算节点。通过NDP设计,查询中的I/O密集型和CPU密集型的大部分工作被下推到存储节点完成,仅将所需列及筛选后的行或聚合后的结果值回传给计算节点,使网络流量大幅减少。同时跨存储节点并行处理,使计算节点CPU使用率下降,提升了查询效率性能。

    另外,NDP框架同GaussDB(for MySQL)并行查询进行融合,并进行了页面批量预取的设计,达成执行全流程并行,进一步提升查询执行效率。

    概念

    功能上,查询业务能进行下推的场景包主要包括三大类:Projection、Aggregate、Select。

    1、Projection

    列裁剪,只有查询语句所需相关字段内容才会被发送到计算节点。

    2、Aggregate

    典型的聚合操作包括:count、sum、avg、max、min、group by,只发送聚合结果(而不是所有元组)到查询引擎,count (*)是一个最常见的场景。

    3、Select - where子句过滤

    常见的条件表达式:Compare(>=,<=,<,>,==)、Between、In、And/Or,like。

    将过滤表达式下推送到存储节点,只有满足条件的行才会发送到计算节点。

    支持范围

    1、当前支持对InnoDB表进行计算下推。

    2、当前支持对COMPACT或DYNAMIC行格式的表进行计算下推。

    3、当前支持对Primary Key或BTREE Index进行计算下推,HASH Index或Full-Text Index不支持计算下推。

    4、当前只支持SELECT查询操作进行计算下推,其他DML语句不支持计算下推,INSERT INTO SELECT也不支持计算下推;SELECT 加锁查询(如 SELECT FOR SHARE/UPDATE)不支持计算下推。

    5、表达式下推支持数值类型、日志和时间类型和部分字符串类型(CHAR, VARCHAR),支持utf8mb4, utf8字符集。

    6、表达式下推谓词支持比较运算(<,>,=,<=,>=,!=), IN, NOT IN, LIKE, NOT LIKE, BETWEEN AND, AND/OR等操作符。

  • 主机或只读节点偶现磁盘占用高,如何处理?

    原因分析

    MySQL内部在执行复杂SQL时,会借助临时表进行分组(group by)、排序(order by)、去重(distinct)、Union等操作,当内存空间不够时,便会使用磁盘空间。

    排查思路

    1.因为其他只读节点磁盘占用空间正常,且是偶尔出现,说明该实例磁盘占用高,与承载的业务相关。

    2.获取该实例的慢日志,分析磁盘占用高期间,是否有对应的慢SQL。

    3.如果有慢SQL,执行explain [慢SQL语句],分析相应慢SQL语句。

    4.观察explain语句输出的extra列,是否有using temporary、using filesort,如果有,说明该语句用到了临时表或临时文件,数据量大的情况下,会导致磁盘占用高。

    解决方案

    1.复杂查询语句导致磁盘打满,建议客户从业务侧优化响应查询语句,常见优化措施:

    −加上合适的索引。

    −在where条件中过滤更多的数据。

    −重写SQL,优化执行计划。

    −如果不得不使用临时表,那么一定要减少并发度。

    2.临时规避措施:考虑业务侧优化复杂查询语句需要一定时间,可以通过临时扩容磁盘空间规避。

  • 如何查看GaussDB(for MySQL)的存储容量

    GaussDB(for MySQL)是存储计算分离架构,数据存储在共享存储系统中,共享存储容量可以通过管理控制台看到,详情请参考如下步骤操作,数据每30分钟更新一次。

    步骤 1登录管理控制台

    步骤 2单击管理控制台左上角的,选择区域和项目。

    步骤 3在页面左上角单击,选择“数据库 > 云数据库 GaussDB(for MySQL)”。

    步骤 4在实例列表中,单击目标实例名称,进入实例的“基本信息”页面。

    步骤 5在基本信息页面的“存储“存储/备份空间”模块可以看到当前实例占用的共享存储容量。

    说明:GaussDB(for MySQL)存储容量的计算与传统MySQL有一定的区别,与传统MySQL使用(数据大小+索引大小+空闲空间)计算的容量数据会有一定的差别。

    如果要查询精确的存储使用量,可以使用管理控制台查询或者连接GaussDB(for MySQL)数据库后,执行show spaceusage;命令查看当前数据使用的存储容量,该值为精确值,非估算值。

    共享存储

    −显示的使用状况就是该实例购买的包周期的共享存储容量及目前数据已占用的容量。

    −如果已使用空间超过购买的共享存储容量,GaussDB(for MySQL)会自动扩容,无需担心磁盘满带来的业务问题。

    −自动扩容的空间会按照按需使用的收费标准收取,建议超出后使用磁盘容量变更功能扩展包周期的存储容量。

    备份空间:

    系统会赠送一份与包周期或按需存储容量相同大小的备份空间。

    ----结束

专题内容推荐

活动规则

活动对象:华为云电销客户及渠道伙伴客户可参与消费满送活动,其他客户参与前请咨询客户经理

活动时间: 2020年8月12日-2020年9月11日

活动期间,华为云用户通过活动页面购买云服务,或使用上云礼包优惠券在华为云官网新购云服务,累计新购实付付费金额达到一定额度,可兑换相应的实物礼品。活动优惠券可在本活动页面中“上云礼包”等方式获取,在华为云官网直接购买(未使用年中云钜惠活动优惠券)或参与其他活动的订单付费金额不计入统计范围内;

  • 云数据库GaussDB(for MySQL)与RDS for MySQL的区别

    查看详情
  • 云数据库 GaussDB(for MySQL)与华为云其他服务的关系

    查看详情
  • 云数据库 RDS for MySQL与其他产品的关系

    查看详情
  • 云数据库 RDS 的实例类型有哪些

    查看详情