StarRocks主键表深度解析:实时更新与高效查询的完美结合

StarRocks主键表深度解析:实时更新与高效查询的完美结合

starrocks StarRocks是一个开源的分布式数据分析引擎,用于处理大规模数据查询和分析。 - 功能:分布式数据分析;大规模数据查询;数据分析;数据仓库。 - 特点:高性能;可扩展;易于使用;支持多种数据源。 starrocks 项目地址: https://gitcode.com/gh_mirrors/st/starrocks

什么是主键表

主键表(Primary Key table)是StarRocks项目中设计的一种特殊表类型,它采用全新的存储引擎设计,主要优势在于支持实时数据更新的同时,还能保证复杂即席查询的高效性能。在实时业务分析场景中,决策者可以利用主键表的最新数据进行实时结果分析,有效缓解数据分析中的数据延迟问题。

主键表的主键具有唯一性约束和非空约束,用于唯一标识表中的每一行数据。当新数据行的主键值与表中已有数据行的主键值相同时,会发生唯一性约束冲突,此时新数据行将替换原有数据行。

适用场景

主键表特别适合以下需要实时数据更新且要求高效查询性能的场景:

  1. 事务处理系统实时流式导入:当需要从交易处理系统(如MySQL)实时同步数据到StarRocks时,主键表是最佳选择。相比采用Merge-On-Read策略的唯一键表,主键表能提供3-10倍的查询性能提升。

  2. 多流合并部分列更新:在用户画像等业务场景中,主键表支持单列更新功能,每个应用或系统可以只更新自己服务范围内的列,同时享受实时数据增删改和高查询性能的优势。

核心技术原理

与传统策略对比

传统唯一键表和聚合表采用Merge-On-Read策略,虽然使数据写入简单高效,但在数据读取时需要在线合并多个版本的数据文件,严重影响查询性能。

Delete+Insert策略

主键表采用Delete+Insert策略,通过主键索引和DelVector实现:

  • 写入过程

    1. 通过内部Loadjob批量处理数据变更操作
    2. 对于Delete操作,使用主键索引找到原始数据位置并在DelVector中标记删除
    3. 对于Update操作,实际上转换为Delete+Insert两步操作
  • 读取过程

    1. 由于历史重复记录已在写入时标记删除
    2. 只需读取具有相同主键值的最新数据行
    3. 过滤操作符和各种索引帮助减少扫描开销

这种策略消除了在线合并多个版本数据文件的需求,使查询性能提升3-10倍。

底层存储结构

StarRocks作为分析型数据库,采用列式存储:

  1. Tablet:表根据分区和分桶机制划分为多个Tablet,是实际的物理存储单元
  2. Rowset:逻辑概念,存储一批数据变更的数据集
  3. Segment:实际存储数据的列式文件,包含列值和相关索引信息
  4. 主键索引:存储主键值与数据行位置的映射关系
  5. DelVector:存储每个段文件的删除标记

实际应用指南

创建主键表

基本语法示例:

CREATE TABLE orders1 (
    order_id bigint NOT NULL,
    dt date NOT NULL,
    user_id INT NOT NULL,
    good_id INT NOT NULL,
    cnt int NOT NULL,
    revenue int NOT NULL
)
PRIMARY KEY (order_id)
DISTRIBUTED BY HASH (order_id);

高级创建选项

考虑数据分布和排序键的优化示例:

CREATE TABLE orders2 (
    order_id bigint NOT NULL,
    dt date NOT NULL,
    merchant_id int NOT NULL,
    user_id int NOT NULL,
    good_id int NOT NULL,
    good_name string NOT NULL,
    price int NOT NULL,
    cnt int NOT NULL,
    revenue int NOT NULL,
    state tinyint NOT NULL
)
PRIMARY KEY (order_id,dt,merchant_id)
PARTITION BY date_trunc('day', dt)
DISTRIBUTED BY HASH (merchant_id)
ORDER BY (dt,merchant_id)
PROPERTIES (
    "enable_persistent_index" = "true"
);

主键设计要点

  1. 主键列必须在CREATE TABLE语句中先定义
  2. 主键列必须包含分区和分桶列
  3. 支持的数据类型:数值型、字符串和日期类型
  4. 默认编码后主键值最大长度为128字节
  5. 创建后不可修改主键
  6. 出于数据一致性考虑,主键值不可更新

主键索引优化

持久化主键索引

enable_persistent_index设为true时:

  • 大部分主键索引存储在磁盘上
  • 查询和更新性能接近全内存主键索引
  • SSD磁盘强烈推荐启用
  • 共享数据集群支持本地磁盘和对象存储持久化

全内存主键索引

enable_persistent_index设为false时:

  • 主键索引完全存储在内存中
  • 适用于内存占用可控的场景:
    • 快慢数据混合场景(如订单表)
    • 宽表但主键数据量小的场景(如用户画像表)

内存占用估算公式: (主键长度 + 9) × 数据行数 × 副本数 × 1.5

排序键设计

从v3.0开始,主键表的排序键与主键解耦:

  • ORDER BY子句定义的列组成
  • 可以是任何列的组合
  • 建议选择常用作查询过滤条件的列

最佳实践建议

  1. 对于实时同步场景,优先选择主键表而非唯一键表
  2. 主键设计应尽量简洁,避免使用过长的字符串类型
  3. 根据数据更新频率合理选择主键索引存储方式
  4. 排序键设计应贴合实际查询模式
  5. 定期监控主键索引的内存使用情况

通过合理设计和优化,主键表能够为实时数据分析场景提供卓越的性能表现,是StarRocks在实时分析领域的重要利器。

starrocks StarRocks是一个开源的分布式数据分析引擎,用于处理大规模数据查询和分析。 - 功能:分布式数据分析;大规模数据查询;数据分析;数据仓库。 - 特点:高性能;可扩展;易于使用;支持多种数据源。 starrocks 项目地址: https://gitcode.com/gh_mirrors/st/starrocks

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘童为Edmond

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值