当前位置: 首页 > news >正文

时序数据库(TDengine TSDB)基本SQL使用完整教程:从入门到实战部署

在实际工作中经常遇到这个场景,今天系统性地总结一下最佳实践和注意事项。

一、说明  

   TDengine (TSDB) 的 SQL 语法与标准 SQL 相似,但其“超级表”(STable)和子表(Table) 的设计是其核心。你可以将超级表理解为一个设备或数据流的模板(定义表结构和标签),而子表则是具体的设备实例(注意TDengine 3.x与2.x的语法确实有重要区别,此篇采用3.3.8版本

二、基本 SQL 使用分为几个核心部分

操作大类关键语句/功能核心要点/目的
库与表管理CREATE DATABASECREATE STABLECREATE TABLE建立数据容器,定义超级表结构(采集指标和标签),创建设备子表。
数据写入INSERT INTO ... VALUESINSERT INTO ... USING ... TAGS支持单条、批量、多表写入;可使用USING子句在写入时自动建表。
数据查询SELECTWHEREGROUP BYORDER BY基础查询,支持条件过滤、聚合、排序。
时序特色查询INTERVAL(时间窗口), SLIDING(滑动窗口), FILL(数据填充)核心时序功能,用于降采样、滑动平均、数据插值等。
数据维护DELETEDROPALTER删除数据记录、删除表/库、修改表结构。

三、TDengine 3.3.8 版本的基本 SQL 语法

类别核心操作/语句主要用途与说明
库操作CREATE DATABASE创建库,3.x关键参数DAYS_PER_FILEBUFFER
ALTER DATABASE修改库参数
DROP DATABASE删除库
超级表操作CREATE STABLE定义数据模型:含数据列和标签列(TAGS)
ALTER STABLE修改超级表结构(增/删标签)
子表操作CREATE TABLE ... USING ... TAGS (...)基于超级表创建具体设备表
INSERT ... USING ... TAGS (...)写入时自动建子表
数据写入INSERT INTO ... VALUES支持单条/批量写入
数据查询SELECT ... FROM ...基础查询,支持WHEREGROUP BYORDER BYLIMIT
SELECT ... FROM stb_name超级表聚合查询,核心是INTERVAL()时间窗口
... INTERVAL(...) SLIDING(...)时序特色:滑动窗口
... FILL(...)时序特色:数据缺失填充
数据维护INSERT (相同时间戳)覆盖更新数据
DELETE FROM ...删除数据
用户与权限CREATE USERGRANT用户管理与权限控制

四. 数据库操作

-- 创建数据库
CREATE DATABASE mydb PRECISION 'ms' KEEP 3650 DURATION 10 BUFFER 96;
--  使用/切换数据库
USE mydb;
-- 修改数据库参数
ALTER DATABASE mydb BUFFER 128;
-- 删除数据库(谨慎!)
DROP DATABASE mydb;
参数值示例含义与作用说明与注意事项
PRECISION‘ms’时间戳精度:指定数据库中时间戳的存储单位。可选 ‘us’(微秒), ‘ns’(纳秒,企业版支持)。一旦设定,不可更改
KEEP3650数据保留天数:单份数据文件在数据库中的最长保存时间。超过此天数的数据文件会被自动删除。这是数据保留的主控制参数
DURATION10文件持续时间:单个数据文件存储多少天的数据。此参数与 KEEP 协同工作,用于控制数据文件的粒度与数量
BUFFER96写入内存缓冲区大小(MB):每个Vnode用于暂存写入数据的内存池。影响写入性能和内存占用。值越大,突发写入能力越强,但消耗内存越多。

4.1 核心参数详解与配置策略

1. PRECISION ‘ms’:时间戳精度
这个参数决定了时间戳字段的最小单位。

  • ‘ms’(毫秒):最常用设置,适用于绝大多数监控场景(如每秒采集一次)。

  • ‘us’(微秒):适用于高频交易、精密仪器等需要微秒级时间记录的场景。

  • 重要提示:此参数在数据库创建后无法修改。如果你的应用未来可能需要更高精度,建议提前规划。

2. KEEP 3650 与 DURATION 10:数据保留与文件管理
这两个参数必须放在一起理解,它们共同管理数据的生命周期和存储结构。

  • KEEP(总保留期):定义了数据的“最长寿命”。例如 KEEP 3650 表示数据最多保存10年,到期后文件会被系统自动清理。

  • DURATION(文件粒度):定义了数据文件的“大小”。例如 DURATION 10 表示每10天的数据会独立存为一个文件

  • 协同工作示例KEEP 3650 DURATION 10 意味着:

    • 系统将每10天的数据打包成一个文件。

    • 同时,系统最多保留约 3650 / 10 = 365 个这样的文件。

    • 当有新的10天数据文件产生时,最旧的那个文件会被删除,始终维持约365个文件。

  • 调整建议

    • DURATION 值越小,单个文件越小,查询特定时间范围可能更快,但文件总数会变多。

    • 通常建议 DURATION 是 KEEP 的 1/10 到 1/100。对于长期存储(KEEP值大),DURATION 也可以相应增大。

3. BUFFER 96:写入性能调节器

  • 作用机制:数据写入时,先进入此内存缓冲区,缓冲区满后才会批量、顺序写入磁盘。这是TDengine实现高效写入的关键。

  • 取值建议

    • 96(MB)是一个通用默认值。

    • 对于写入吞吐量极高的场景,可适当调大(如 256 或 512),以平滑写入波动,提升性能。

    • 内存有限Vnode数量极多的环境下,需调小以防内存耗尽。

      优化建议:

      如果你的项目访问量较大,建议增加缓存机制。我们团队在优化后,接口响应时间从800ms降到了50ms, 效果非常明显。具体的缓存策略可以根据业务场景调整。

4.2 配置实例与建议

假设一个物联网平台,有10万台设备,每30秒上报一次数据。

  1. 基础配置

    CREATE DATABASE mydbPRECISION 'ms'   -- 毫秒精度足够KEEP 1095        -- 保留3年历史数据DURATION 30      -- 每30天一个数据文件(3年约有36个文件)BUFFER 128;      -- 中等写入负载,128MB缓冲区

  2. 高性能写入场景(如金融高频数据):

    CREATE DATABASE trade_marketPRECISION 'us'   -- 需要微秒级时间记录KEEP 365         -- 保留1年DURATION 10      -- 每10天一个文件BUFFER 256;      -- 较大的缓冲区应对突发写入

  3. 修改现有数据库参数(使用 ALTER DATABASE):

    -- 可以调整 BUFFER, KEEP, DURATION 等参数(PRECISION除外)
    ALTER DATABASE mydb BUFFER 256;
    ALTER DATABASE mydb KEEP 1800 DURATION 15;

4.3 总结

  • PRECISION:按需选择。

  • KEEP 和 DURATION联合设定数据保存策略和存储粒度,影响查询效率与文件数量。

  • BUFFER:根据写入负载和内存资源动态调整,是重要的性能调优参数。

五. 超级表操作

超级表是核心模型,定义数据结构和设备标签

-- 创建超级表
CREATE STABLE devices (ts TIMESTAMP,           -- 【必须】时间戳主键temperature FLOAT,      -- 采集指标1humidity INT,           -- 采集指标2status BINARY(10)       -- 采集指标3
) TAGS (device_id BINARY(64),   -- 设备ID标签region NCHAR(20),       -- 地域标签group_id INT            -- 组标签
);
-- 查看超级表定义
DESCRIBE devices;
-- 修改超级表(如增加标签)
ALTER STABLE devices ADD TAG `comment` BINARY(100);
ALTER STABLE devices DROP TAG  `comment`;

六、子表操作

子表通过超级表模板创建,代表具体设备。

-- 显式创建子表(为设备'd1001'建表)
CREATE TABLE d1001 USING devices TAGS ('device_001', 'cangzhou', 1);
--【常用】写入时自动创建子表
INSERT INTO d1002 USING devices TAGS ('device_002', 'tianjin', 2) VALUES (NOW, 25.3, 50, 'normal');
-- 查看子表信息(如标签值)
SELECT * FROM INFORMATION_SCHEMA.INS_TAGS WHERE TABLE_NAME='d1001';

七、数据写入

-- 写入单条数据
INSERT INTO d1001 VALUES ('2026-01-21 00:00:00.000', 23.5, 60, 'normal');
--【高效】批量写入(多条VALUES用空格分隔)
INSERT INTO d1001 VALUES('2026-01-21 00:00:10.000', 23.8, 61, 'normal')('2026-01-21 00:00:20.000', 24.1, 59, 'normal');
-- 向多个子表批量写入
INSERT INTO d1001 VALUES ('2026-01-21 00:00:30', 24.0, 62, 'normal')d1002 VALUES ('2026-01-21 00:00:30', 26.1, 55, 'normal');

八、数据查询

-- 基础查询(与标准SQL类似)
SELECT * FROM d1001 LIMIT 10;
SELECT AVG(temperature), MAX(humidity) FROM d1001
WHERE ts > '2026-01-21' AND ts < '2026-01-22';
-- 超级表聚合查询(核心功能)
-- 按设备标签`device_id`分组计算
SELECT device_id, AVG(temperature) FROM devices
WHERE group_id = 1
GROUP BY device_id;
-- 时序特色查询:时间窗口聚合(INTERVAL)
-- 每1小时计算一次平均温度
SELECT _WSTART, _WEND, AVG(temperature) FROM devices
WHERE region='cangzhou'
INTERVAL(1h); -- 时间窗口子句
-- 时序特色查询:滑动窗口(SLIDING)
-- 每5分钟计算一次过去10分钟的滑动平均
SELECT _WSTART, AVG(temperature) FROM devices
INTERVAL(10m) SLIDING(5m);
-- 时序特色查询:数据填充(FILL)
-- 在1小时窗口内,如果无数据,用前一个值填充
SELECT _WSTART, AVG(temperature) FROM devices
INTERVAL(1h) FILL(PREV);
-- 获取子表名(TBNAME)与标签值
SELECT TBNAME, device_id, ts, temperature FROM devices;

九、数据更新与删除

-- 数据更新(通过相同时间戳写入新值覆盖)
INSERT INTO d1001 (ts, temperature) VALUES ('2026-01-21 00:00:00', 256.0);
-- 删除数据(谨慎!可基于时间戳和标签条件)
DELETE FROM devices WHERE ts < '2026-01-22'; -- 删除超级表下旧数据
DELETE FROM d1001 WHERE ts = '2026-01-01 00:00:00';

十、用户与权限管理

-- 创建用户
CREATE USER admin PASS 'your_secure_password';
-- 授予权限
GRANT ALL PRIVILEGES ON mydb.* TO admin; -- 所有权限
GRANT READ ON mydb.* TO user1;           -- 只读权限
-- 收回权限
REVOKE ALL PRIVILEGES ON mydb.* FROM user1;

十一、重要提醒

  • 版本差异:你遇到的语法错误,核心是3.x将DAYS改为DAYS_PER_FILE。另一个常见区别是CACHEMODEL参数在3.x中已移除。

  • 语句长度:单个SQL语句最大长度为1MB,写入时需合理规划批量大小。

  • 性能核心

    1. 务必使用批量写入(多行VALUES)。

    2. 对超级表查询时,尽量在WHERE中使用标签字段过滤,效率远高于时间后过滤。

    3. 合理规划INTERVAL窗口长度,平衡查询效率与数据精度。

十二、官方文档

遇到不确定的语法或函数,最权威的参考是 TDengine 3.0 官方SQL手册

http://www.jsqmd.com/news/386659/

相关文章:

  • Seedance 2.0 vs 上一代角色保持技术:3轮跨姿态/光照/遮挡压力测试,谁真正守住ID一致性?
  • 保姆级教程:Qwen3-TTS从安装到调参全流程指南
  • 导师推荐!继续教育专属降AI工具 —— 千笔
  • 国产GPU集群部署Seedance 2.0,角色动作抖动率下降82.6%——全链路特征保持技术拆解,含华为CANN 7.0适配补丁
  • DeepChat深度对话引擎:5分钟搭建私有化AI聊天室(Llama3驱动)
  • 解锁学术写作新次元:书匠策AI如何让课程论文“智变”升级?
  • LongCat-Image-Edit实测:用提示词精准编辑图片的秘诀
  • GTE文本向量模型5分钟快速部署指南:中文NLP多任务处理
  • Cursor+Claude AI编程 - Cursor模型会话上下文窗口介绍
  • PowerPaint-V1开源大模型实战:结合Segment Anything生成精准Mask提升修复效率
  • Java高频面试题:讲一下 ZooKeeper 的持久化机制?
  • AI追星新姿势:用文字生成孙珍妮同款写真
  • RMBG-1.4开源大模型实战:AI净界Web界面快速上手图文教程
  • WAN2.2文生视频+SDXL_Prompt风格保姆级教程:视频尺寸/时长/帧率参数详解
  • 学术写作新次元:解锁书匠策AI的“课程论文通关秘籍”
  • Lychee-rerank-mm边缘计算部署:树莓派实战
  • 矩阵空间的 (非) 交换秩
  • csp信奥赛C++学习,想弯道超车的来!给你这份价值3W的秘籍!让这个假期过得更有意义!
  • Hunyuan-MT-7B多语言客服系统搭建:支持33种语言对话
  • Jimeng LoRA动态切换指南:无需重复加载的高效测试方案
  • 无需NLP基础:基于OFA的WebUI图像描述工具一键部署指南
  • EasyAnimateV5-7b-zh-InP模型Docker部署最佳实践
  • Qwen-Image-Edit惊艳效果:15秒完成专业级照片编辑
  • DeepSeek-OCR-2快速入门:Gradio界面操作全解析
  • AI印象派艺术工坊适合哪些场景?文旅宣传落地实战案例详解
  • 学术探险新装备:书匠策AI带你解锁课程论文“通关秘籍”
  • 特征崩塌?身份漂移?Seedance 2.0低成本角色保持方案全解析,一线团队已紧急部署
  • HG-ha/MTools步骤详解:如何验证ONNX Runtime是否成功调用GPU算力
  • Qwen2.5-7B-Instruct长文本处理实战:万字技术白皮书生成与结构化输出
  • Qwen3-Reranker-8B在医疗文献检索中的惊艳表现