主键
- 主键=时间戳 (ts) + 标签 (TAG) 组合
- 同一个子表 + 同一个时间戳,只能有一条数据
- 重复插入会覆盖,不会报错。
超级表和子表
- 超级表必须手动建一次,子表不需要手动建,插入数据时自动创建
- 超级表是模板,子表是实例
- 超级表不存数据,子表才存数据
- 插入自动建子表,查询超级表查全部
表设计原则
- 一类数据一张超级表
- 一个设备一张子表
- 不变的属性放 TAG
- 变化的数据放普通字段
- 必须有 ts 时间戳
sql
复制代码
CREATE DATABASE IF NOT EXISTS iot_db KEEP 30d DURATION 1d;
USE iot_db;
CREATE STABLE device_temperature (
ts TIMESTAMP, -- 时间戳(必须第一个字段)
temperature FLOAT -- 温度(实时变化)
)
TAGS (
device_id NCHAR(32), -- 设备编号(TAG)
workshop NCHAR(32), -- 车间(TAG)
line NCHAR(16), -- 产线(TAG)
area NCHAR(16) -- 区域(TAG)
);
sql
复制代码
INSERT INTO temp_sensor_001
USING device_temperature
TAGS('sensor_001','workshop_A','line_1','area_2')
VALUES(NOW(), 28.5);
为什么 TDengine 这么快?
- 按时间分片存储(列式存储)
- 数据按时间块(duration)存储
- 同一列数据存在一起,压缩率极高
- 查询只读需要的列,不读整行,IO 大幅减少
- 超级表 + 子表模型(最关键)
- 一个设备一张子表
- 数据天然按设备隔离
- 查询时只扫描对应子表,不扫全表,查询速度提升百倍
- 写入是顺序写磁盘
- 时序数据永远是最新时间戳
- 磁盘顺序写比随机写快100 倍以上
TDengine 完全利用这一点
- 内置聚合、降采样、窗口函数
- AVG、MAX、MIN、COUNT、FIRST、LAST
- 全部在数据库内核完成
- 不需要应用层计算
- 无事务、无锁、无主键约束
子表说明
- TAG 插入一次,永久不变
- 子表和 TAG 强绑定
- 不能 UPDATE TAG
- 后面插入只需要 INSERT INTO 子表 VALUES (...)
- 想改 TAG 必须新建子表,也可以删除子表再新建子表
delete和update
- 可以delete超级表和子表
- 可以delete,但只能按照时刻或时间范围删除
- 不可以update,使用delete和insert模拟
- 数据是 append 模式:只写、只删、不改
常用命令
sql
复制代码
SHOW STABLES # 看所有超级表
SHOW TABLES # 看所有子表
SHOW TABLES LIKE "超级表名.%" # 看这个超级表下的子表