表概述
表是数据存储单元。相比于传统的数据库, StarRocks 以列的方式存储 JSON 、Array 等复杂的半结构化数据,保证高效查询。 StarRocks 中的表在逻辑上由行(Row)和列(Column)构成:
行:每一行代表一条记录,包含了一组相关联的数据。
列:列定义了一条记录所包含的属性。
表类型
StarRocks 提供四种类型的表,包括主键表(Primary Key table)、明细表(Duplicate key table)、聚合表(Aggregate table)和更新表(Unique Key table),适用于存储多种业务数据,例如原始数据、实时频繁更新的数据和聚合数据。
主键表:能力强大,具有唯一性非空约束。该表能够在支撑实时更新、部分列更新等场景的同时,保证查询性能,适用于实时查询。
明细表:简单易用,相同的数据行可以重复存在。该表适用于存储不需要约束和预聚合的原始数据,例如日志等。
聚合表:适用于存储预聚合后的数据,可以降低聚合查询时所需扫描和计算的数据量,极大提高聚合查询的效率。
更新表:适用于实时更新的业务场景,目前已逐渐被主键表取代。
注意:
建表后,表类型不支持修改。如需修改表类型,请重新建表。
在创建表时,您可以将一个或多个列定义为排序键。排序键在建表语句中的出现次序,为数据存储时多重排序的次序。
不支持排序键的数据类型为 BITMAP、HLL。
前缀索引的长度限制为 36 字节。如果排序键中全部列的值的长度加起来超过 36 字节,则前缀索引仅会保存限制范围内排序键的若干前缀列。
主键表
主键表中的主键具有唯一非空约束,用于唯一标识数据行。如果新数据的主键值与表中原数据的主键值相同,则存在唯一约束冲突,此时新数据会替代原数据。本文以示例来介绍使用方法。更多详细信息,请参考文档 主键表。
-- 建表时通过 PRIMARY KEY 定义主键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);
明细表
明细表是默认创建的表类型。如果在建表时未指定任何 key,默认创建的是明细表。建表时支持定义排序键。如果查询的过滤条件包含排序键,则 StarRocks 能够快速地过滤数据,提高查询效率。本文以示例来介绍使用方法。更多详细信息,请参考文档 明细表。
-- 建表时将 event_time 和 event_type 作为排序键CREATE TABLE detail (event_time DATETIME NOT NULL COMMENT "datetime of event",event_type INT NOT NULL COMMENT "type of event",user_id INT COMMENT "id of user",device_code INT COMMENT "device code",channel INT COMMENT "")ORDER BY (event_time, event_type);
聚合表
建表时可以定义聚合键并且为 value 列指定聚合函数。当多条数据具有相同的聚合键时,value 列会进行聚合。并且支持单独定义排序键,如果查询的过滤条件包含排序键,则 StarRocks 能够快速地过滤数据,提高查询效率。本文以示例来介绍使用方法。更多详细信息,请参考文档 聚合表。
-- 建表时将 site_id、 date 和 city_code 作为聚合键-- 将访问次数 pv 作为 value 列,并为 value 列 pv 指定聚合函数为 SUMCREATE TABLE aggregate_tbl (site_id LARGEINT NOT NULL COMMENT "id of site",date DATE NOT NULL COMMENT "time of event",city_code VARCHAR(20) COMMENT "city_code of user",pv BIGINT SUM DEFAULT "0" COMMENT "total page views")AGGREGATE KEY(site_id, date, city_code)DISTRIBUTED BY HASH(site_id);
更新表
建表时需要定义唯一键。当多条数据具有相同的唯一键时,value 列会进行 REPLACE,查询时返回唯一键相同的一组数据中的最新数据。并且支持单独定义排序键,如果查询的过滤条件包含排序键,则 StarRocks 能够快速地过滤数据,提高查询效率。本文以示例来介绍使用方法。更多详细信息,请参考文档 更新表。
-- 建表时将常用的过滤字段作为指标列CREATE TABLE orders (create_time DATE NOT NULL COMMENT "create time of an order",order_id BIGINT NOT NULL COMMENT "id of an order",order_state INT COMMENT "state of an order",total_price BIGINT COMMENT "price of an order")UNIQUE KEY(create_time, order_id)DISTRIBUTED BY HASH(order_id);