本文介绍了多机并行执行能力的技术背景、技术原理、适用场景以及使用说明等内容。
背景信息
列存索引(IMCI)是PolarDB的HTAP解决方案。随着用户查询数据量、查询复杂度以及对OSS等外部表的查询需求的增加,单个只读列存节点已无法满足海量数据场景下的性能需求。因此,IMCI提供了多机并行执行能力和资源弹升能力。
技术架构
列存索引多机并行执行技术架构如下:
列存索引多机并行是由多个只读列存节点组成的一个多机执行组,并提供多机并行执行能力。随着用户查询负载的变化,用户可以快速增加或减少只读列存节点的个数,以平衡查询性能和计算成本。
多机并行执行可以处理多种类型的AP负载,IMCI的优化器可以准确判断出适合查询语句的TP,并选择单机执行AP或多机并行执行AP,最终将查询语句调度到适合的列存节点上。
适用场景
通过多机并行的资源弹升能力扩展CPU和IOPS,降低查询时延。
通过每台机器只处理部分数据来提升数据缓存能力,将单机无法做到的全内存场景转变为多机全内存场景,从而提升查询的吞吐量。
版本限制
PolarDB MySQL版集群的产品版本需为企业版,集群版本需为PolarDB MySQL版8.0.1版本且修订版本为8.0.1.1.38及以上。
使用说明
添加多个只读列存节点。具体操作请参见添加只读列存节点。
通过钉钉搜索群号27520023189并加入该群,将会有对应的研发人员协助您开启并使用列存索引的多机并行能力。
最佳实践
分区键
PolarDB中一级或二级分区采用HASH和KEY类型的分区策略的分区表,在IMCI多机执行环境中的处理方式为share-nothing。这种方式意味着每个分区仅由一台机器进行处理,从而产生以下优势:
提升数据缓存能力:每台机器只需处理其负责的分区,有助于更有效地利用本地内存缓存数据。
优化查询性能:在基于分区键进行的
JOIN
操作和GROUP BY
查询时,只需在每台机器上本地处理数据,即可显著减少多机之间的数据传输量。
基于上述原因,建议在建表时,根据常用的JOIN
和 GROUP BY
分区键来设置HASH或KEY类型的一级或二级分区。此外,所有的HASH或KEY类型分区需要具有相同的分区数量,因为如果两个表的分区数量不同,则它们之间的JOIN
操作无法在本地进行处理。
推荐选择一个足够大的质数作为分区数量,这是为了减少数据分布不均匀的可能性,进一步提升查询性能和系统资源的有效利用。
排序键
海量数据的过滤可以通过使用范围(range)类型的分区或在列存储中增加排序键来实现。建议对where中能用predicate大量过滤的列建立range分区和增加排序键。例如,针对如下的查询条件:WHERE date > '2024-10-01' AND date < '2024-10-07' AND customer_id = 'X231'
可以为date
列建立范围分区,并为customer_id
列增加IMCI排序键。这种做法可以显著减少需要处理的数据量,从而提升查询性能。 通过合理配置分区和设置列索引的排序键,不仅可以提高数据处理效率,还能优化海量数据环境下的查询响应速度。
性能测试
列存索引的多机并行执行性能测试请参见列存索引(IMCI)性能。
其他操作
判断当前SQL语句是否可以使用列存索引的多机并行能力
您可以通过在SQL语句中添加HINT语法
SET_VAR(imci_plan_use_mpp=forced)
来查看SQL语句的执行计划,以此来判断该SQL语句是否可以使用多机并行能力。示例如下:EXPLAIN SELECT /*+ SET_VAR(imci_plan_use_mpp=forced) */ COUNT(*) FROM nation;
查询结果如下:
+----+----------------------------+--------+---------------------------------------------------------------------------------+ | ID | Operator | Name | Extra Info | +----+----------------------------+--------+---------------------------------------------------------------------------------+ | 1 | Select Statement | | IMCI Execution Plan (max_dop = 11, max_query_mem = 37438953472) | | 2 | └─Compute Scalar | | | | 3 | └─Aggregation | | | | 4 | └─Consume | | Consume ProducerPipeId: 1 | | 5 | └─Exchange | | PipeId: 1, Consumers: 23377031, Producers: 23377031,23377032, Part Type: Gather | | 6 | └─Aggregation | | | | 7 | └─Table Scan | nation | | +----+----------------------------+--------+---------------------------------------------------------------------------------
若执行计划中有Exchange算子,则表示该SQL语句可以使用列存索引的多机并行能力。
判断某条SQL语句是否会通过列存索引的多机并行能力执行
当判断出某条SQL语句可以使用列存索引的并行执行能力后,您可以通过查看某条SQL语句的执行计划来查看是否会使用列存索引的多机并行能力。若执行计划中有Exchange算子,则表示该SQL语句会通过列存索引多机并行执行。