多机分析

更新时间:
复制为 MD 格式

本文介绍PolarDB MySQL列存表的多机并行执行能力,包括技术架构、适用场景、最佳实践和性能测试。

说明

若您对列存表多机并行功能有任何问题,可通过钉钉搜索群号入群咨询。您可以直接@群内专家,并附上您要咨询的问题。

钉钉群号:24490017825

背景信息

列存表是PolarDBOLAP解决方案。随着查询数据量、查询复杂度以及对OSS等外部表的查询需求的增加,单个只读节点已无法满足海量数据场景下的性能需求。因此,列存表集群提供了多机并行执行能力和资源弹升能力。

技术架构

列存表多机并行是由多个只读节点组成的一个多机执行组,并提供多机并行执行能力。随着查询负载的变化,您可以快速增加或减少只读节点的个数,以平衡查询性能和计算成本。

image

适用范围

您的PolarDB MySQL版集群需满足以下条件:

  • 产品版本企业版

  • 内核版本MySQL 8.0.2,且内核小版本需为8.0.2.2.34及以上版本。

适用场景

  • 通过多机并行的资源弹升能力扩展CPUIOPS,降低查询时延。

  • 通过每个节点只处理部分数据来提升数据缓存能力。

最佳实践

在处理海量数据的分析查询时,核心目标是减少数据传输(Shuffle)和减少磁盘读取(I/O)。PolarDB的列存表通过分区键和排序键这两个强大的工具,帮助您实现优越的查询性能。

分区键

分区键用于在多个节点间分布数据,其核心思想是“让相关的数据在一起计算”。

工作原理

PolarDB中一级或二级分区采用HASHKEY类型的分区策略的分区表,列存表多机执行环境中的处理方式为Share-Nothing。这种方式意味着每个分区仅由一个节点进行处理。

核心优势

  • 提升数据缓存能力:每个节点只需处理其负责的分区,有助于更有效地利用本地内存缓存数据。

  • 优化查询性能:在基于分区键进行的JOIN 操作和GROUP BY查询时,只需在每个节点上本地处理数据,即可显著减少多机之间的数据传输量。

最佳实践

  • 选择业务核心关联键:优先选择最常用的 JOIN 或 GROUP BY 的列作为分区键(例如 order_iduser_id)。

  • 保持分区数量一致:进行 JOIN 的多个表,其 HASH/KEY 分区数量必须完全相同,否则无法实现本地化计算。

  • 使用大质数作为分区数:推荐选择一个足够大的质数(如 97, 199)作为分区数量,这能最大程度地保证数据在各机器间均匀分布,避免数据倾斜。

排序键

排序键用于在每个物理分区内部组织数据,其核心思想是“跳过读取不相关的数据”。海量数据的过滤可以通过使用范围(range)类型的分区或在列存表中增加排序键来实现。

工作原理

在列式存储中,数据被组织成多个数据块(Stripe)。通过设置排序键,每个数据块内部的数据会按照指定列物理有序。数据库在查询时,会利用每个数据块头部的元数据(如最大/最小值)进行判断。

核心优势

  • 高效数据裁剪:这是排序键的核心价值。当WHERE子句中包含对排序键的过滤条件时,查询引擎可以直接跳过(裁剪掉)那些数据范围完全不符合条件的整个数据块,从而减少需要扫描的磁盘I/O。

最佳实践

  • 选择高频过滤列:将 WHERE子句中频繁使用的过滤列,特别是进行范围查询(><BETWEEN)或高基数等值查询的列,设为排序键。

  • 组合使用,效果更佳:将排序键与RANGE类型的分区结合使用,可以实现多层次的过滤。

性能测试结果

以下是一组规格为32256 GB,3个节点组成的MPP集群,在TPC-H 1 TB的全列存表多机测试结果:

说明

本文的TPC-H的实现基于TPC-H的基准测试,并不能与已发布的TPC-H基准测试结果相比较,本文中的测试并不完全符合TPC-H的所有要求。

Query

Time(s)

Q1

8.189

Q2

0.567

Q3

1.784

Q4

1.38

Q5

2.268

Q6

2.359

Q7

2.068

Q8

1.593

Q9

10.761

Q10

10.054

Q11

0.795

Q12

7.595

Q13

10.848

Q14

3.023

Q15

2.286

Q16

2.253

Q17

11.651

Q18

25.612

Q19

11.557

Q20

2.739

Q21

4.82

Q22

3.141

TOTAL

127.343

常见问题

如何判断SQL是否已启用多机并行(MPP)?

PolarDB列存表的多机并行(MPP)能力可以加速复杂查询。您可以通过分析SQ 的EXPLAIN执行计划,轻松判断查询是否利用了这一强大特性。核心标志是是否存在Exchange算子。

  1. 第一步:强制生成 MPP 计划,判断“可能性”

    首先,需要确认您的SQL语句本身是否具备被优化器改写为MPP计划的潜力。这可以通过一个特定的HINT来实现。

    操作方法
    在您的SQL语句前加上EXPLAIN,并插入/*+ SET_VAR(imci_plan_use_mpp=forced) */这个HINT。这个HINT会强制优化器尝试生成一个MPP执行计划。

    示例

    EXPLAIN SELECT /*+ SET_VAR(imci_plan_use_mpp=forced) */ COUNT(*) FROM nation;

    结果解读
    执行上述命令后,如果返回的执行计划中包含了Exchange算子,那么恭喜您,这证明您的SQL逻辑上可以利用多机并行能力。

  2. 第二步:查看实际执行计划,判断“真实性”

    确认了可能性之后,再来检查在不加任何HINT的正常情况下,优化器是否实际选择了MPP模式来执行您的 SQL。

    操作方法
    直接对您的原始SQL语句执行EXPLAIN

    示例

    EXPLAIN SELECT COUNT(*) FROM nation;

    结果解读

    • 如果执行计划中出现了Exchange算子:这表明优化器在综合评估成本后,认为MPP是最高效的方式,并已经为您的查询启用了多机并行执行。

    • 如果执行计划中没有Exchange算子:这可能意味着

      • 查询过于简单,或者涉及的数据量太小,优化器认为单机执行更快。

      • SQL 的写法或表的结构(如分区键设置)限制了MPP的使用。您可以回到第一步,检查并优化您的SQL 或表设计。