本文介绍PolarDB MySQL版列存表的多机并行执行能力,包括技术架构、适用场景、最佳实践和性能测试。
若您对列存表多机并行功能有任何问题,可通过钉钉搜索群号入群咨询。您可以直接@群内专家,并附上您要咨询的问题。
钉钉群号:24490017825
背景信息
列存表是PolarDB的OLAP解决方案。随着查询数据量、查询复杂度以及对OSS等外部表的查询需求的增加,单个只读节点已无法满足海量数据场景下的性能需求。因此,列存表集群提供了多机并行执行能力和资源弹升能力。
技术架构
列存表多机并行是由多个只读节点组成的一个多机执行组,并提供多机并行执行能力。随着查询负载的变化,您可以快速增加或减少只读节点的个数,以平衡查询性能和计算成本。
适用范围
您的PolarDB MySQL版版集群需满足以下条件:
产品版本:企业版。
内核版本:MySQL 8.0.2,且内核小版本需为8.0.2.2.34及以上版本。
适用场景
通过多机并行的资源弹升能力扩展CPU和IOPS,降低查询时延。
通过每个节点只处理部分数据来提升数据缓存能力。
最佳实践
在处理海量数据的分析查询时,核心目标是减少数据传输(Shuffle)和减少磁盘读取(I/O)。PolarDB的列存表通过分区键和排序键这两个强大的工具,帮助您实现优越的查询性能。
分区键
分区键用于在多个节点间分布数据,其核心思想是“让相关的数据在一起计算”。
工作原理
PolarDB中一级或二级分区采用HASH和KEY类型的分区策略的分区表,列存表多机执行环境中的处理方式为Share-Nothing。这种方式意味着每个分区仅由一个节点进行处理。
核心优势
提升数据缓存能力:每个节点只需处理其负责的分区,有助于更有效地利用本地内存缓存数据。
优化查询性能:在基于分区键进行的
JOIN操作和GROUP BY查询时,只需在每个节点上本地处理数据,即可显著减少多机之间的数据传输量。
最佳实践
选择业务核心关联键:优先选择最常用的
JOIN或GROUP BY的列作为分区键(例如order_id,user_id)。保持分区数量一致:进行
JOIN的多个表,其 HASH/KEY 分区数量必须完全相同,否则无法实现本地化计算。使用大质数作为分区数:推荐选择一个足够大的质数(如 97, 199)作为分区数量,这能最大程度地保证数据在各机器间均匀分布,避免数据倾斜。
排序键
排序键用于在每个物理分区内部组织数据,其核心思想是“跳过读取不相关的数据”。海量数据的过滤可以通过使用范围(range)类型的分区或在列存表中增加排序键来实现。
工作原理
在列式存储中,数据被组织成多个数据块(Stripe)。通过设置排序键,每个数据块内部的数据会按照指定列物理有序。数据库在查询时,会利用每个数据块头部的元数据(如最大/最小值)进行判断。
核心优势
高效数据裁剪:这是排序键的核心价值。当
WHERE子句中包含对排序键的过滤条件时,查询引擎可以直接跳过(裁剪掉)那些数据范围完全不符合条件的整个数据块,从而减少需要扫描的磁盘I/O。
最佳实践
选择高频过滤列:将
WHERE子句中频繁使用的过滤列,特别是进行范围查询(>,<,BETWEEN)或高基数等值查询的列,设为排序键。组合使用,效果更佳:将排序键与
RANGE类型的分区结合使用,可以实现多层次的过滤。
性能测试结果
以下是一组规格为32核256 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算子。
第一步:强制生成 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逻辑上可以利用多机并行能力。第二步:查看实际执行计划,判断“真实性”
确认了可能性之后,再来检查在不加任何HINT的正常情况下,优化器是否实际选择了MPP模式来执行您的 SQL。
操作方法
直接对您的原始SQL语句执行EXPLAIN。示例
EXPLAIN SELECT COUNT(*) FROM nation;结果解读
如果执行计划中出现了
Exchange算子:这表明优化器在综合评估成本后,认为MPP是最高效的方式,并已经为您的查询启用了多机并行执行。如果执行计划中没有
Exchange算子:这可能意味着查询过于简单,或者涉及的数据量太小,优化器认为单机执行更快。
SQL 的写法或表的结构(如分区键设置)限制了MPP的使用。您可以回到第一步,检查并优化您的SQL 或表设计。