StarRocks数据模型之主键模型(当前版本v3.1)
StarRocks表设计数据模型,有四种:分别是明细模型(Dumplicate Key table),聚合模型(Aggregate table),更新模型(Unique Key table),主键模型(Primary Key table)。这篇文章主要从总览、适用场景、原理、使用说明等几个方面对主键模型(Primary Key table)进行阐述,在官网基础上进行了适量的拓展。
? 总览
主键模型(Primary Key table),支持分别定义主键和排序列,主键必须指定,但是排序键可选,当指定了排序键时,根据排序键构建前缀索引;如果没有指定排序键,则根据主键构建前缀索引。数据导入主键模型的表中,按照排序键先后存储。主键模型采用Merge-On-Write方式进行数据写入,当数据写入表中时,通过主键查询到对应数据,没查到的直接通过Append方式写入,查到则按照Delete + Insert 方式将数据写入表中,故而在查询时不需要进行聚合,并且支持谓词和索引下推,适用于读多写少的场景。其次,支持索引/主键持久化到磁盘以及数据的冷热存储(即最近几天的热数据才经常被修改,老的冷数据很少被修改,除了整体数据外,主键也适用,例如老的数据持久化到磁盘中),减少内存开销。
适用场景
主键模型(Primary Key table)适用于实时和频繁更新的场景,如实时对接TP数据库至StarRocks,当然也可以使用更新模型,但是更新模型采用Update方式写入数据,是通过Merge-On-Read读取数据,在读多写少的场景中,使用主键模型,查询性能会更高;还有类似利用部分列更新轻松实现多流Join,在用户画像等分析场景中,一般会通过宽表方式提升多维分析性能,但是数据来源往往是多个业务或系统,主键模型通过更新部分列而不是整行数据,性能得到提升。
? 原理
主键模型是由StarRocks全新设计开发的存储引擎。主键模型采用了 Delete+Insert 的策略,保证同一个主键下仅存在一条记录,这样就完全避免了 Merge 操作。具体实现方式如下:StarRocks 收到对某记录的更新操作时,会通过主键索引找到该条记录的位置,并对其标记为删除,再插入一条新的记录。相当于把 Update 改写为 Delete+Insert;StarRocks 收到对某记录的删除操作时,会通过主键索引找到该条记录的位置,对其标记为删除。这样,查询时不需要执行聚合操作,不影响谓词和索引的下推,保证了查询的高效执行。写入流程:加载数据到内存;数据排序,并将更新和删除的数据操作不同,分到不同的数据集中,攒够一批之后,提交事务,通过主键找到对应数据,删除过期bitmap索引,最终将数据写入表中。可参考下图:
? 使用说明
? 1、不管是否开启索引持久化,应尽可能减少索引长度,且单条主编码最大长度为128字节。
? 2、建表时,必须使用 DISTRIBUTED BY HASH
子句指定分桶键,否则建表失败;主键列必须在其他列之前,通过PRIMARY KEY定义,且必须满足唯一定义,分区列和分桶列必须在主键中,主键支持以下数据类型:BOOLEAN、TINYINT、SMALLINT、INT、BIGINT、LARGEINT、DATE、DATETIME、VARCHAR/STRING,并且不允许为 NULL。
? 3、可在建表时的PROPERTIES中配置enable_persistent_index参数,表示是否持久化索引,取值范围为 true
或者 false
(默认值)。
? 4、通过 ORDER BY
关键字指定排序键,可指定为任意列的排列组合。
? 5、支持使用 ALTER TABLE 进行表结构变更,但是存在如下注意事项:不支持修改主键;支持修改排序键,但是不支持修改排序键数据类型,也不允许删除排序键;不支持调整列顺序。
6、主键之外的列新增支持 BITMAP(精准去重)、HLL (近似去重)数据类型。详细请参照:https://blog.csdn.net/sunjian286/article/details/132266417,StarRocks基于Doris开发,可参照后者。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!