数据建模指南
表结构设计将极大影响写入和查询性能。 在写入数据之前,你需要了解业务中涉及到的数据类型、数据规模以及常用查询, 并根据这些数据特征进行数据建模。 本文档将详细介绍 GreptimeDB 的数据模型使用指南,以及常见场景的表结构设计方式。
了解 GreptimeDB 的数据模型
在阅读本文档之前,请先阅读 GreptimeDB 数据模型文档。
基本概念
基数(Cardinality):指数据集中唯一值的数量。可以分为"高基数"和"低基数":
- 低基数(Low Cardinality):低基数列通常具有固定值。
唯一值的总数通常不超过1万个。
例如,
namespace、cluster、http_method通常是低基数的。 - 高基数(High Cardinality):高基数列包含大量的唯一值。
例如,
trace_id、span_id、user_id、uri、ip、uuid、request_id、表的自增 ID,时间戳通常是高基数的。
列类型
在 GreptimeDB 中,列被分为三种语义类型:Tag、Field 和 Timestamp。
时间戳通常表示数据采样的时间或日志/事件发生的时间。
GreptimeDB 使用 TIME INDEX 约束来标识 Timestamp 列。
因此,Timestamp 列也被称为 TIME INDEX 列。
如果你有多个时间戳数据类型的列,你只能将其中一个定义为 TIME INDEX,其他的定义为 Field 列。
在 GreptimeDB 中,Tag 列是可选的。Tag 列的主要用途包括:
- 定义存储时数据的排序方式。
GreptimeDB 使用
PRIMARY KEY约束来定义 tag 列和 tag 的排序顺序。 与传统数据库不同,GreptimeDB 的主键是用来定义时间序列的。 GreptimeDB 中的表按照(primary key, timestamp)的顺序对行进行排序。 这提高了具有相同 tag 数据的局部性。 如果没有定义 tag 列,GreptimeDB 按时间戳对行进行排序。 - 唯一标识一个时间序列。 当表不是 append-only 模式时,GreptimeDB 根据时间戳在同一时间序列(主键)下去除重复行。
- 便于从使用 label 或 tag 的其他时序数据库迁移。