新闻资讯

华为云数据库揭秘:GaussDB(for MySQL)并行查询能有多快?
来源:GaussDB数据库 | 作者:GaussDB数据库 | 发布时间: 1378天前 | 1540 次浏览 | 分享到:
华为云 GaussDB (for MySQL)是华为最新一代、高性能、企业级、分布式关系数据库, 根植MySQL开源社区,不仅继承了开源所有的查询分析特性,而且还面向企业级应用查询负载开发了许多增强功能,如并行查询、查询计算下推(NDP: Near Data Processing)等。



      「饶珑辉,华为云数据库内核专家。十年以上数据库内核研发经验,精通MySQL内核原理和源码。负责华为云数据库GaussDB(for MySQL)的高性能SQL查询引擎功能规划、设计和研发。」



      一般而言,数据库有两种非常广泛的应用场景,即“事务处理”和“查询分析”。开源 MySQL作为国内最常用的关系型数据库之一,在5.1版中就开始支持事务处理。伴随着技术的发展,开源 MySQL不仅在版本更新迭代期间不断增强事务处理能力,而且最新的 MySQL8.0版已经开始支持许多查询分析功能,如 Window function、 CTE、 HashJoin、列直方图、并行 COUNT计算等等。


      华为云 GaussDB (for MySQL)是华为最新一代、高性能、企业级、分布式关系数据库, 根植MySQL开源社区,不仅继承了开源所有的查询分析特性,而且还面向企业级应用查询负载开发了许多增强功能,如并行查询、查询计算下推(NDP: Near Data Processing)等。


      由于事务处理以数据增、删、改、查为主,更注重实时响应、高吞吐、事务性等要求,传统数据解决方案中,将“事务分析”和“查询分析”分别放在不同类型的库上完成。但是,“查询分析”主要是大量的复杂计算,更注重数据容量的扩展和复杂的计算能力等。


      下面的图表显示了传统的数据解决方案: OLTP数据库满足在线事务处理要求, OLAP数据仓库满足分析型查询要求。



      用户需要哪些数据库?


      目前行业对于数据库的普遍需求是:实时响应、高吞吐、满足事务性、良好的扩展能力和支持复杂查询。对使用者来说,这有许多好处:第一,降低部署成本,用户只需部署一套数据库集群即可;第二,解决了数据迁移时延的问题,更新和查询运行在同一套集群中;第三,支持事务性查询,满足一致性、原则性、隔离性和持久性等要求,使查询结果更准确。


      根据用户需求,华为云原生数据库 GaussDB(for MySQL)通过技术创新,具有同时满足事务处理和查询分析的能力。GaussDB (for MySQL)是一款 OLTP事务关系数据库,它采用100%兼容 MySQL语法,在架构上采用计算与存储分离的设计,可独立在线扩展计算资源和存储资源。存储层使用华为自研的分布式存储系统 DFV (数据功能虚拟化: Data Function Virtualisation),最大可扩展至128 TB容量,单个计算节点最大规格支持64核 CPU512 G的内存容量,最多可以支持1个写节点15个只读节点


      GaussDB (for MySQL)除了具有强大的资源扩展功能外,还分别对事务处理和查询分析进行了优化,极大地增强了事务的读取和写入能力。这篇文章主要关注增强的查询分析功能之一:并行查询。


      查询分析提升之道:释放CPU多核计算资源


      软件计算能力的提高一方面得益于 CPU硬件能力的提高,另一方面也得益于软件设计层面能够充分利用 CPU的计算资源。目前的处理器普遍采用多核设计,比如 GaussDB (for MySQL)单个节点可以支持64核 CPU。单线程查询至多能使用一整个核心的 CPU资源,其性能提升程度有限,远不能满足企业大数据量查询场景下降低延迟的要求。所以,在进行复杂查询分析型计算过程,必须充分利用 CPU的多核计算资源,让多核参与并行计算任务,才能大大提高查询计算的处理效率。


      下面的图表是一个使用 CPU多核资源来并行计算一个表的 count (*)过程的示例:表数据切块后分发给多个核以进行并行计算,每个核计算的部分数据都产生一个中间 count (*)结果,并在最后阶段汇总所有中间结果以获得最终结果。



      GaussDB (for MySQL)查询分析秘笈:并行查询


      GaussDB (for MySQL)支持并行执行的查询方式,以减少分析型查询场景的处理时间,满足企业级应用对低延迟查询的要求。如前所述,并行查询的基本实现原理是将查询任务切分分布到多个 CPU核上进行运算,充分利用 CPU的多核计算资源,缩短查询时间。在理论上,并行查询的性能倍数与 CPU的核数正相关,也就是说,并行度越高能够使用的 CPU核数越多,从而提高性能。


      下面的图表显示:在 GaussDB (for MySQL)的64 U实例上查询100G数据量所需的 COUNT (*)查询所需时间,不同查询并发度分别对应不同的耗时,并发度越高,查询所需时间越短。




      GaussDB (for MySQL)支持多种类型的并行查询算子,以满足各种不同的复杂查询场景。目前最新版本(2021-9)已支持的并行查询场景如下:


      主要查询、二级索引查询


      主键扫描、索引扫描、范围扫描、索引等值查询,索引逆向查询


      并行条件过滤(where/having),投影计算


      并发多表 JOIN (包括 HashJoin、 NestLoopJoin、 SemiJoin等)查询


      并行聚合函数运算,包括SUM/AVG/COUNT/BIT_AND/BIT_OR/BIT_XOR等


      并行表达式运算,包括算术运算、逻辑运算、一般函数运算及混合运算等


      并行分组group by、排序order by、limit/offset、distinct运算


      并行UNION、子查询、视图查询


      并行分区表查询


      并行查询支持的数据类型包括:整型、字符型、时间类型、浮点型等等


      其他查询


      下面的图是 GaussDB (for MySQL)并行查询对TPC-H的22个查询场景进行的性能测试,测试数据量为100 G,并发线程数据为32。下面的图表显示了与传统 MySQL单线程查询相比,并行查询的性能提高:32并行执行下,单表复杂查询最高26倍性能,一般提高20+倍性能。多表JOIN复杂查询最高性能提高近27倍,总体性能提高10倍以上。子查询的性能也得到了显著的提高。



      总之, GaussDB (for MySQL)并行查询充分调用了 CPU的多核计算资源,大大减少了分析型查询场景的处理时间,大大提高了数据库性能,可以很好地满足客户多种复杂查询场景的低延迟要求。