在分布式环境下,跨节点 JOIN 操作或全表扫描可能导致网络传输开销激增。例如,未合理设计分区键可能导致数据倾斜,而缺失全局索引会迫使查询遍历多分片。
1 个赞
这一部分内容牵扯到了物理资源性质、业务系统运行特点来调整对用的索引和分区
这玩意丢给研发去弄吧,一旦设计完成,回头难度不低。
根据文档库中的信息,以下是从分区策略和索引设计两个方面优化 OceanBase 数据库分布式查询性能的详细方法:
一、分区策略优化
-
选择合适的分区键
-
根据业务需求选择分区键,确保大多数查询能够利用分区键进行分区裁剪,减少数据访问量。例如,在 AP 场景中,如果查询通常涉及最近的数据,可以按时间列(如
DATE
或TIMESTAMP
)进行RANGE
分区,并结合HASH
分区进一步分散数据(参考片段标题:数据表设计最佳实践 → 分区)。CREATE TABLE t1 (c1 DATE, c2 INT, c3 INT) PARTITION BY RANGE COLUMNS (c1) SUBPARTITION BY HASH (c2) SUBPARTITIONS 32 ( PARTITION p0 VALUES LESS THAN ('2024-01-01'), PARTITION p1 VALUES LESS THAN ('2024-02-01'), PARTITION p2 VALUES LESS THAN ('2024-03-01') );
-
对于关联性强的表,建议使用关联键作为分区键,并采用相同的分区方式,将这些表放入同一个
Table Group
中,以减少跨节点的数据交互(参考片段标题:分布式执行和并行查询 → 分布式执行)。
-
-
避免数据倾斜
- 确保分区键的选择具有高基数(NDV,Number of Distinct Values),以避免某些分区存储过多数据,导致查询性能下降。例如,优先选择整形列或时间列作为分区键,而不是低基数的
VARCHAR
列(参考片段标题:数据表设计最佳实践 → 分区)。
- 确保分区键的选择具有高基数(NDV,Number of Distinct Values),以避免某些分区存储过多数据,导致查询性能下降。例如,优先选择整形列或时间列作为分区键,而不是低基数的
-
合理配置分区数
- 分区数应根据集群规模动态调整,通常推荐为一个 Zone 内所有机器 CPU 总数的两倍,以充分利用硬件资源并支持未来的扩容需求(参考片段标题:数据表设计最佳实践 → 分区)。
二、索引设计优化
-
优先使用本地索引
- 默认情况下,分区表创建的是本地索引(
LOCAL
)。本地索引与分区表保持一对一的关系,每个索引分区仅覆盖对应的主表分区数据,从而避免分布式事务的开销(参考片段标题:使用 OceanBase 数据库分区表进行水平拆分 → 分区表 → 分区表的索引)。CREATE INDEX idx_log_date ON t_log_part_by_range_hash(log_date) LOCAL;
- 默认情况下,分区表创建的是本地索引(
-
谨慎使用全局索引
- 全局索引(
GLOBAL
)适用于以下场景:- 查询条件无法提供分区键时,可以通过全局索引避免全分区扫描。
- 需要满足非分区键列的全局唯一性约束。
- 然而,全局索引会增加写入成本,因为每一笔写入可能变成跨机的分布式事务。因此,仅在必要时使用全局索引(参考片段标题:OceanBase 数据库性能的影响因素 → 资源分配 → 局部索引和全局索引 → 全球索引)。
CREATE INDEX idx_log_date2 ON t_log_part_by_range_hash(log_value, log_date) GLOBAL;
- 全局索引(
-
结合查询模式设计索引
- 如果查询通常包含分区键,则优先创建本地索引,利用分区裁剪功能提升性能。
- 如果查询不包含分区键但有其他常用过滤条件,则可以考虑创建全局索引或全局分区索引(参考片段标题:使用 OceanBase 数据库分区表进行水平拆分 → 分区表 → 分区表的索引)。
三、综合优化建议
-
减少跨节点数据交互
- 将频繁 JOIN 的表放置在同一节点上(通过
Table Group
实现),以降低网络传输开销。 - 确保分区策略一致,避免因分区不匹配导致的额外数据重分布。
- 将频繁 JOIN 的表放置在同一节点上(通过
-
避免全表扫描
- 确保查询条件中包含分区键,以便 OceanBase 数据库优化器能够自动裁剪无关分区。
- 在必要时,为常用查询路径创建针对性的索引。
-
监控与调优
- 定期分析查询计划,检查是否存在不必要的全分区扫描或跨节点数据交互。
- 根据实际负载调整分区策略和索引设计,确保系统性能持续优化。
通过以上方法,可以显著提升 OceanBase 数据库在分布式环境下的查询性能,同时降低网络传输和计算资源的开销。
更多信息请查看:
好的,我试一下