跳到主要内容
版本: 最新版-4.0

表概述

表是数据存储的单元。了解 StarRocks 中的表结构以及如何设计高效的表结构有助于优化数据组织和提高查询效率。此外,与传统数据库相比,StarRocks 可以以列式存储复杂的数据,如 JSON、ARRAY,以提高查询性能。

本主题从基础和全面两个方面介绍 StarRocks 中的表结构。

从 v3.3.1 开始,StarRocks 支持在默认目录 (Default Catalog) 中创建临时表。

开始了解基础表结构

与其他关系型数据库一样,表在逻辑上由行和列组成

  • 行:每行包含一条记录。每行包含一组相关的数据值。
  • 列:列定义每条记录的属性。每列保存特定属性的数据。例如,一个员工表可能包含姓名、员工 ID、部门和薪水等列,其中每列存储相应的数据。每列中的数据具有相同的数据类型。表中的所有行具有相同数量的列。

在 StarRocks 中创建表非常简单。您只需在 CREATE TABLE 语句中定义列及其数据类型即可创建表。示例

CREATE DATABASE example_db;
USE example_db;
CREATE TABLE user_access (
uid int,
name varchar(64),
age int,
phone varchar(16),
last_access datetime,
credits double
)
ORDER BY (uid, name);

上述 CREATE TABLE 示例创建了一个明细表 (Duplicate Key table)。此类表中不对列添加任何约束,因此表中可以存在重复的数据行。明细表的前两列被指定为排序列,以构成排序键。数据在基于排序键排序后存储,这可以加速查询时的索引查找。

自 v3.3.0 起,明细表支持使用 ORDER BY 指定排序键。如果同时使用 ORDER BYDUPLICATE KEY,则 DUPLICATE KEY 不生效。

注意

如果预发布环境中的 StarRocks 集群只有一个 BE,可以在 PROPERTIES 子句中将副本数设置为 1,例如 PROPERTIES( "replication_num" = "1" )。默认副本数为 3,这也是生产 StarRocks 集群推荐的副本数。如果您想使用默认副本数,则无需配置 replication_num 参数。

执行 DESCRIBE 查看表结构。

MySQL [test]> DESCRIBE user_access;
+-------------+-------------+------+-------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-------+---------+-------+
| uid | int | YES | true | NULL | |
| name | varchar(64) | YES | true | NULL | |
| age | int | YES | false | NULL | |
| phone | varchar(16) | YES | false | NULL | |
| last_access | datetime | YES | false | NULL | |
| credits | double | YES | false | NULL | |
+-------------+-------------+------+-------+---------+-------+
6 rows in set (0.00 sec)

执行 SHOW CREATE TABLE 查看 CREATE TABLE 语句。

MySQL [example_db]> SHOW CREATE TABLE user_access\G
*************************** 1. row ***************************
Table: user_access
Create Table: CREATE TABLE `user_access` (
`uid` int(11) NULL COMMENT "",
`name` varchar(64) NULL COMMENT "",
`age` int(11) NULL COMMENT "",
`phone` varchar(16) NULL COMMENT "",
`last_access` datetime NULL COMMENT "",
`credits` double NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`uid`, `name`)
DISTRIBUTED BY RANDOM
ORDER BY(`uid`, `name`)
PROPERTIES (
"bucket_size" = "4294967296",
"compression" = "LZ4",
"fast_schema_evolution" = "true",
"replicated_storage" = "true",
"replication_num" = "3"
);
1 row in set (0.01 sec)

了解全面的表结构

深入了解 StarRocks 表结构可帮助您根据业务需求设计高效的数据管理结构。

表类型

StarRocks 提供四种类型的表:明细表 (Duplicate Key tables)、主键表 (Primary Key tables)、聚合表 (Aggregate tables) 和唯一键表 (Unique Key tables),以存储各种业务场景的数据,例如原始数据、频繁更新的实时数据和聚合数据。

  • 明细表简单易用。此类表中不对列添加任何约束,因此表中可以存在重复的数据行。明细表适用于存储不需要任何约束或预聚合的原始数据,例如日志。
  • 主键表功能强大。主键列同时具有唯一性和非空约束。主键表支持实时频繁更新和部分列更新,同时确保高查询性能,因此适用于实时查询场景。
  • 聚合表适用于存储预聚合数据,有助于减少扫描和计算的数据量,提高聚合查询的效率。
  • 唯一键表也适用于存储频繁更新的实时数据。然而,此类表正被功能更强大的主键表所取代。

数据分布

StarRocks 使用分区 (partitioning) + 分桶 (bucketing) 的两层数据分布策略,将数据均匀地分布到各个 BE 节点。设计良好的数据分布策略可以有效减少扫描的数据量,最大化 StarRocks 的并发处理能力,从而提高查询性能。

img

分区

第一层是分区:表中的数据可以根据分区列划分为更小的数据管理单元,分区列通常是包含日期和时间的列。查询时,分区裁剪可以减少需要扫描的数据量,从而有效优化查询性能。

StarRocks 提供易于使用的分区方法——表达式分区 (expression partitioning),同时也提供更灵活的方法,如范围分区 (range partitioning) 和列表分区 (list partitioning)。

分桶

第二层是分桶:分区内的数据通过分桶进一步划分为更小的数据管理单元。每个分桶的副本均匀分布在各个 BE 节点上,以确保高数据可用性。

StarRocks 提供两种分桶方法

  • 哈希分桶 (Hash bucketing):数据根据分桶键的哈希值分布到各个桶中。您可以选择查询中经常用作条件列的列作为分桶列,这有助于提高查询效率。
  • 随机分桶 (Random bucketing):数据随机分布到各个桶中。这种分桶方法更简单易用。

数据类型

除了 NUMERIC、DATE 和 STRING 等基本数据类型外,StarRocks 还支持复杂的半结构化数据类型,包括 ARRAY、JSON、MAP 和 STRUCT。

索引

索引是一种特殊的数据结构,用作表中数据的指针。当查询中的条件列是索引列时,StarRocks 可以快速定位满足条件的行。

StarRocks 提供内置索引:前缀索引 (Prefix indexes)、序数索引 (Ordinal indexes) 和区域映射索引 (ZoneMap indexes)。StarRocks 也允许用户创建索引,即位图索引 (Bitmap indexes) 和布隆过滤器索引 (Bloom Filter indexes),以进一步提高查询效率。

约束

约束有助于确保数据的完整性、一致性和准确性。主键表中的主键列必须具有唯一且非空的值。聚合表中的聚合键列和唯一键表中的唯一键列必须具有唯一值。

临时表

在处理数据时,您可能需要保存中间结果以供将来重用。在早期版本中,StarRocks 只支持使用 CTE(通用表表达式)在单个查询中定义临时结果。然而,CTE 只是逻辑结构,不实际存储结果,也不能跨不同查询使用,这带来了一定的限制。如果选择创建表来保存中间结果,您将需要管理这些表的生命周期,这可能会产生额外的开销。

为解决此问题,StarRocks 在 v3.3.1 中引入了临时表。临时表允许您临时存储数据(例如 ETL 过程中的中间结果)在一个表中,其生命周期与会话绑定并由 StarRocks 管理。当会话结束时,临时表会自动清除。临时表仅在当前会话中可见,不同的会话可以创建同名的临时表。

使用方法

您可以在以下 SQL 语句中使用 TEMPORARY 关键字来创建和删除临时表

注意

与其它类型的原生表类似,临时表必须在默认目录下的数据库中创建。但是,由于临时表是基于会话的,因此它们不受唯一命名约束的限制。您可以在不同会话中创建同名的临时表,甚至可以创建与其它非临时、原生表同名的临时表。

如果数据库中存在同名的临时表和非临时表,临时表具有优先权。在会话中,对同名表的所有查询和操作将仅影响临时表。

限制

虽然临时表的使用与原生表类似,但仍存在一些限制和差异

  • 临时表必须在默认目录 (Default Catalog) 中创建。
  • 不支持设置共存组 (colocate group)。如果在创建表时明确指定了 colocate_with 属性,该属性将被忽略。
  • 创建表时,ENGINE 必须指定为 olap
  • 不支持 ALTER TABLE 语句。
  • 不支持基于临时表创建视图和物化视图。
  • 不支持 EXPORT 语句。
  • 不支持使用 SUBMIT TASK 异步任务创建临时表或从/向临时表加载数据。

更多功能

除了上述功能外,您还可以根据业务需求采用更多功能来设计更稳健的表结构。例如,使用位图 (Bitmap) 和 HLL 列来加速去重计数,指定生成列 (generated columns) 或自增列 (auto-increment columns) 来加速某些查询,配置灵活的自动存储冷热分离 (storage cooldown) 方法来降低维护成本,以及配置共存 Join (Colocate Join) 来加速多表 JOIN 查询。更多详情,请参阅 CREATE TABLE

开心的水獭 RockyStarRocks 助手

AI 生成的答案基于文档和其他来源。请在非生产环境中测试答案。