云原生多模数据库 Lindorm计算引擎OLAP资源组支持访问湖模式列存数据、AP模式列存数据和宽表引擎数据三种数据源。本文主要介绍如何创建AP模式列存表。
根据数据的存储方式,可以分为主键表和明细表两种类型:
明细表:保留所有导入记录,允许主键重复。用户可完整查询历史数据,每条记录与原始数据一一对应。
主键表:强制主键唯一性约束,禁止重复主键。新导入数据会覆盖相同主键的旧记录,确保每个主键仅存最新版本。
创建明细表
仅需在CREATE TABLE语句中定义列和列的数据类型,即可创建一张表。
CREATE TABLE user_access (
uid int,
name varchar(64),
age int,
phone varchar(16),
last_access datetime,
credits double
)
ORDER BY (uid, name);在上述建表示例中,创建的是明细表,该表的数据不具有任何约束,允许主键重复(即相同数据行可能多次出现)。同时,指定前两列为排序列,构成排序键;数据按此排序键排序后存储,可显著提升查询时的索引效率,实现快速数据检索。
创建主键表
主键表的核心优势是支持实时数据更新和高效复杂即席查询,在实时分析业务中采用主键表,能实时处理最新数据指导决策,消除 T+1 数据延迟限制。只需在CREATE TABLE语句中使用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)
;主键表仅支持哈希分桶策略,建表时必须通过 DISTRIBUTED BY HASH() 指定哈希分桶键。
实际业务中,通常会结合数据分布、排序键等功能提升查询效率与数据管理能力。主键表将主键与排序键解耦,用户可根据高频查询条件灵活设计排序键。例如经常按订单日期(dt)和商户ID(merchant_id)查询销售数据时,可通过 ORDER BY (dt,merchant_id) 设置排序键,显著提升范围查询效率。
数据分布
建表时,用户可以通过设置合理的分区和分桶,实现数据均匀分布和查询性能提升。数据均匀分布是指数据按照一定规则划分为子集,并且均衡地分布在不同节点上。查询时能够有效裁剪数据扫描量,最大限度地利用集群的并发性能,从而提升查询性能。
分区
分区用于将数据划分成不同的区间,主要作用是将一张表按照分区键拆分成不同的管理单元。
建表时使用PARTITION BY子句指定,支持指定按一个或多个列的值分区,或者基于表达式计算结果的分区。
分桶
一个分区按分桶方式被分成了多个桶(bucket),每个桶的数据称之为一个 tablet。
分桶方式:支持随机分桶和哈希分桶。通过建表时使用DISTRIBUTED BY来指定。
随机分桶:建表或新增分区时无需设置分桶键。在同一分区内,数据随机分布到不同的分桶中。
哈希分桶:建表和新增分区时需要指定分桶键。在同一分区内,数据按照分桶键划分分桶后,所有分桶键的值相同的行会唯一分配到对应的一个分桶。
分桶数量默认由系统自动设定,无需手动配置。
使用示例
CREATE TABLE t_recharge_detail1 (
id bigint,
user_id bigint,
recharge_money decimal(32,2),
city varchar(20) not null,
dt varchar(20) not null
)
DUPLICATE KEY(id)
PARTITION BY dt,city
DISTRIBUTED BY HASH(`id`);上述建表语句说明了按(日期、城市)对表进行分区,然后按 id 列进行哈希分桶。