【公测中】行列混存表
StarRocks 属于 OLAP 数据库,原先数据是按列存储的方式,能够提高复杂查询(例如聚合查询)的性能。自 3.2.3 开始,StarRocks 还支持行列混存的表存储格式,能够支撑基于主键的高并发、低延时点查,以及数据部分列更新等场景,同时还保留了原有列存的高效分析能力。此外,行列混存表还支持预准备语句,能够提高查询的性能和安全性。
列存和行列混存对比
行列混存
-
存储方式:数据同时按照列和行存储。简单来说,行列混存表会额外加一个隐藏的二进制类型的列
__row
,写入数据至表的同时还会将一行数据所有 value 列编码后的值写入列__row
(如下所示)。由于数据同时按照列和行存储,因此会带来额外的存储成本。 -
适用场景:能够兼顾行存和列存的场景,但是会带来额外的存储成本。
- 按行存储的适用场景。
- 基于主键的高并发点查。
- 表的字段个数比较少,并且通常会查询大部分字段。
- 部分列更新(更新多列和 少量数据行)
- 列存的场景:复杂数据分析。
列存
-
存储方式:按列存储数据。
-
适用场景:复杂数据分析。
- 针对海量数据进行复杂查询分析,比如聚合分析、多表关联查询。
- 表的字段比较多(比如大宽表),但查询的字段不多。
基本操作
创建行列混存表
-
开启 FE 配置项
enable_experimental_rowstore
。ADMIN SET FRONTEND CONFIG ("enable_experimental_rowstore" = "true");
-
建表时在
PROPERTIES
中配置"STORE_TYPE" = "column_with_row"
。
备注
- 必须为主键表。
__row
列的长度不能超过 1 MB。- 自 3.2.4 起,列的类型新增支持 BITMAP、HLL、JSON、ARRAY、MAP 和 STRUCT。
- 表中除了主键列外必须包含更多的列。
CREATE TABLE users (
id bigint not null,
country string,
city string,
revenue bigint
)
PRIMARY KEY (id)
DISTRIBUTED BY HASH(id)
PROPERTIES ("storage_type" = "column_with_row");