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

TDengine 与 MYSQL 的差异总结

在这里插入图片描述

TDengine 与 MySQL 语法差异深度解析

引言

TDengine 作为专为时序数据设计的数据库,虽然支持类 SQL 语法,但与传统关系型数据库 MySQL 在语法层面存在显著差异。

1. 核心概念差异

1.1 数据模型差异

TDengine 核心概念:

  • 超级表(Super Table):数据模型模板
  • 子表(Child Table):实际存储数据的表
  • 标签(Tags):用于分类和索引的元数据

MySQL 核心概念:

  • 表(Table):基本存储单元
  • 索引(Index):查询优化结构

1.2 时序数据特性

TDengine 专门为时序数据设计,每个表必须包含时间戳列,而 MySQL 是通用关系型数据库。

2. DDL 语法差异

2.1 创建数据库

TDengine:

-- 创建数据库时支持时序数据特定参数
CREATE DATABASE power BUFFER 64 CACHEMODEL 'none' CACHESIZE 1 COMP 2 DURATION 10 KEEP 3650 PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 RETENTIONS 15s:7d,1m:21d,15m:500d;

MySQL:

-- MySQL 数据库创建相对简单
CREATE DATABASE power CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2.2 超级表创建(TDengine 独有)

-- 创建超级表,定义数据结构模板
CREATE STABLE meters (ts TIMESTAMP,           -- 时间戳列(必须)current FLOAT,          -- 电流voltage INT,            -- 电压phase FLOAT            -- 相位
) TAGS (location NCHAR(64),     -- 位置标签group_id INT           -- 组ID标签
);

MySQL 没有对应的超级表概念。

2.3 子表创建

TDengine:

-- 方式1:使用超级表创建子表
CREATE TABLE d1001 USING meters TAGS ('Beijing.Chaoyang', 2);-- 方式2:批量创建子表
CREATE TABLE d1001 USING meters TAGS ('Beijing.Chaoyang', 2)d1002 USING meters TAGS ('Beijing.Haidian', 3)d1003 USING meters TAGS ('Shanghai.Pudong', 1);

MySQL:

-- MySQL 直接创建表
CREATE TABLE d1001 (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,current FLOAT,voltage INT,phase FLOAT,location VARCHAR(64),group_id INT,INDEX idx_ts (ts)
);

2.4 虚拟表创建(TDengine 独有)

-- 创建虚拟表
CREATE VTABLE v_meters (ts TIMESTAMP,current FLOAT,voltage INT,phase FLOAT
);-- 使用超级表创建虚拟子表
CREATE VTABLE v_d1001 USING meters TAGS ('Virtual.Location', 999);

3. 数据类型差异

3.1 TDengine 支持的数据类型

-- TDengine 完整数据类型
CREATE TABLE sensor_data (ts TIMESTAMP,                        -- 时间戳(8字节,必须存在)-- 整型tiny_col TINYINT,                    -- 1字节 [-128, 127]small_col SMALLINT,                  -- 2字节 [-32768, 32767] int_col INT,                         -- 4字节 [-2^31, 2^31-1]big_col BIGINT,                      -- 8字节 [-2^63, 2^63-1]-- 无符号整型utiny_col TINYINT UNSIGNED,          -- 1字节 [0, 255]usmall_col SMALLINT UNSIGNED,        -- 2字节 [0, 65535]uint_col INT UNSIGNED,               -- 4字节 [0, 2^32-1]ubig_col BIGINT UNSIGNED,            -- 8字节 [0, 2^64-1]-- 浮点型float_col FLOAT,                     -- 4字节单精度double_col DOUBLE,                   -- 8字节双精度-- 高精度数值decimal_col DECIMAL(10,2),           -- 精度1-38,标度0-精度-- 字符串型binary_col BINARY(100),              -- 固定长度,最大65517字节varchar_col VARCHAR(100),            -- BINARY别名nchar_col NCHAR(50),                 -- Unicode,4字节/字符varbinary_col VARBINARY(200),        -- 可变长二进制-- 布尔型bool_col BOOL,                       -- 1字节布尔值-- JSON型(仅标签)json_tag JSON,                       -- 仅用于TAGS-- 大对象blob_col BLOB,                       -- 二进制大对象-- 几何型geometry_col GEOMETRY(100)           -- 2D几何数据
);

3.2 主要差异对比

特性TDengineMySQL差异说明
时间戳TIMESTAMP(必须)TIMESTAMP(可选)TDengine每表必须有
无符号整型完整支持完整支持语法相同
字符串BINARY/NCHAR/VARCHAR/VARBINARYCHAR/VARCHAR/TEXT系列TDengine无CHAR/TEXT
UnicodeNCHAR(固定4字节)字符集配置TDengine固定编码
JSON仅TAGS支持普通列支持TDengine限制更严
几何GEOMETRY(2D)完整空间类型TDengine仅2D
日期时间仅TIMESTAMPDATE/TIME/DATETIMETDengine专注时序
枚举集合不支持ENUM/SETTDengine不支持

3.3 TDengine 特殊限制


-- ✅ 正确:JSON仅用于标签
CREATE STABLE sensors (ts TIMESTAMP, temp FLOAT) 
TAGS (config JSON);-- ❌ 错误:JSON不能用于数据列
-- CREATE TABLE sensors (ts TIMESTAMP, config JSON);-- ✅ 正确:字符串类型选择
CREATE TABLE text_data (ts TIMESTAMP,ascii_text BINARY(100),      -- ASCII字符unicode_text NCHAR(50),      -- 中文等多字节binary_data VARBINARY(200)   -- 二进制数据
);

3.4 从MySQL迁移建议

MySQL类型TDengine替代说明
CHARBINARY固定长度字符串
TEXTNCHAR长文本内容
DATE/TIMETIMESTAMP统一时间类型
ENUMTINYINT枚举值映射
SETVARCHAR集合值序列化

4. DML 语法差异

4.1 数据插入

TDengine 多表批量插入:

-- TDengine 支持一条语句向多表插入数据
INSERT INTO 
d1001 VALUES ('2023-10-01 10:00:00', 10.2, 220, 0.23),('2023-10-01 10:01:00', 12.6, 218, 0.33)
d1002 VALUES ('2023-10-01 10:00:00', 10.3, 219, 0.25),('2023-10-01 10:01:00', 10.1, 221, 0.22)
d1003 VALUES('2023-10-01 10:00:00', 11.5, 222, 0.35),('2023-10-01 10:01:00', 10.8, 220, 0.31);

MySQL:

-- MySQL 需要分别插入
INSERT INTO d1001 VALUES ('2023-10-01 10:00:00', 10.2, 220, 0.23, 'Beijing.Chaoyang', 2),('2023-10-01 10:01:00', 12.6, 218, 0.33, 'Beijing.Chaoyang', 2);INSERT INTO d1002 VALUES ('2023-10-01 10:00:00', 10.3, 219, 0.25, 'Beijing.Haidian', 3),('2023-10-01 10:01:00', 10.1, 221, 0.22, 'Beijing.Haidian', 3);

4.2 自动建表插入(TDengine 独有)

-- 插入时自动创建子表
INSERT INTO d1004 USING meters TAGS ('Shanghai.Jingan', 4)
VALUES ('2023-10-01 10:00:00', 9.8, 223, 0.28);-- 批量自动建表插入
INSERT INTO 
d1005 USING meters TAGS ('Guangzhou.Tianhe', 5) VALUES ('2023-10-01 10:00:00', 11.2, 221, 0.32)
d1006 USING meters TAGS ('Shenzhen.Nanshan', 6) VALUES ('2023-10-01 10:00:00', 10.7, 219, 0.29);

4.3 数据更新和删除

TDengine:

-- TDengine 只支持基于时间范围的删除
DELETE FROM meters WHERE ts < '2023-01-01 00:00:00';
DELETE FROM d1001 WHERE ts BETWEEN '2023-10-01 10:00:00' AND '2023-10-01 11:00:00';-- 注意:TDengine 不支持传统的 UPDATE 语句
-- 更新数据通过重新插入相同时间戳的数据实现

MySQL:

-- MySQL 支持灵活的更新和删除
UPDATE d1001 SET current = 11.0 WHERE ts = '2023-10-01 10:00:00';
DELETE FROM d1001 WHERE current > 15.0;

5. DQL 语法差异

5.1 时间窗口查询(TDengine 独有)

-- 时间窗口聚合查询
SELECT AVG(current), AVG(voltage), location 
FROM meters 
WHERE ts >= '2023-10-01 00:00:00' AND ts < '2023-10-02 00:00:00'
INTERVAL(1h)
GROUP BY location;-- 会话窗口
SELECT COUNT(*), location 
FROM meters 
SESSION(ts, 10m)
GROUP BY location;-- 状态窗口
SELECT AVG(current), location
FROM meters 
STATE_WINDOW(status)
GROUP BY location;-- 事件窗口
SELECT COUNT(*), location
FROM meters 
EVENT_WINDOW START WITH current > 15 END WITH current < 5
GROUP BY location;

5.2 超级表查询

-- 查询超级表(自动包含所有子表数据)
SELECT ts, current, voltage, location 
FROM meters 
WHERE ts >= '2023-10-01 00:00:00' AND location LIKE 'Beijing%'
ORDER BY ts DESC;-- 标签过滤查询
SELECT TBNAME, AVG(current) 
FROM meters 
WHERE group_id = 2 
GROUP BY TBNAME;

5.3 插值查询(TDengine 独有)

-- 插值查询
SELECT INTERP(current), INTERP(voltage)
FROM d1001 
WHERE ts BETWEEN '2023-10-01 10:00:00' AND '2023-10-01 12:00:00'
EVERY(10m)
FILL(LINEAR);-- 时间范围插值
SELECT INTERP(current)
FROM d1001 
RANGE('2023-10-01 10:00:00', '2023-10-01 12:00:00', '10m')
FILL(PREV);

5.4 伪列查询(TDengine 独有)

-- 使用伪列
SELECT TBNAME,           -- 表名_WSTART,          -- 窗口开始时间_WEND,            -- 窗口结束时间_WDURATION,       -- 窗口持续时间QTAGS,            -- 查询标签AVG(current)
FROM meters 
WHERE ts >= '2023-10-01 00:00:00'
INTERVAL(1h)
GROUP BY TBNAME;

6. 函数差异

6.1 TDengine 特有函数

-- 时序数据特有函数
SELECT FIRST(current, ts),           -- 第一个值LAST(current, ts),            -- 最后一个值LAST_ROW(*),                  -- 最新一行数据DIFF(current),                -- 差值计算DERIVATIVE(current, ts, 1s),  -- 导数计算IRATE(current),               -- 瞬时变化率TWA(current),                 -- 时间加权平均LEASTSQUARES(current, 1, 1)   -- 最小二乘法拟合
FROM d1001 
WHERE ts >= '2023-10-01 00:00:00';-- 选择函数
SELECT TOP(current, 5),              -- 前5个最大值BOTTOM(current, 3),           -- 前3个最小值PERCENTILE(current, 50),      -- 50分位数APERCENTILE(current, 90)      -- 近似90分位数
FROM d1001;

6.2 MySQL 对比

-- MySQL 标准聚合函数
SELECT AVG(current),MAX(current),MIN(current),COUNT(*),STD(current),                 -- 标准差VARIANCE(current)             -- 方差
FROM d1001 
WHERE ts >= '2023-10-01 00:00:00';

7. 连接查询差异

7.1 TDengine 连接语法

-- TDengine 支持的连接类型
SELECT d1.ts, d1.current, d2.voltage
FROM d1001 d1
INNER JOIN d1002 d2 ON d1.ts = d2.ts;-- 左连接
SELECT d1.ts, d1.current, d2.voltage
FROM d1001 d1
LEFT JOIN d1002 d2 ON d1.ts = d2.ts;-- ASOF 连接(时间序列特有)
SELECT d1.ts, d1.current, d2.voltage
FROM d1001 d1
LEFT ASOF JOIN d1002 d2 ON d1.ts >= d2.ts;-- 窗口连接
SELECT d1.ts, d1.current, d2.voltage
FROM d1001 d1
LEFT WINDOW JOIN d1002 d2 ON d1.ts = d2.ts
WINDOW_OFFSET(-1m, 1m);

7.2 MySQL 连接语法

-- MySQL 标准连接
SELECT d1.ts, d1.current, d2.voltage
FROM d1001 d1
INNER JOIN d1002 d2 ON d1.ts = d2.ts AND d1.location = d2.location;-- 子查询连接
SELECT * FROM d1001 d1
WHERE d1.ts IN (SELECT ts FROM d1002 WHERE voltage > 220
);

8. 特殊语法结构

8.1 分区查询(TDengine)

-- 按标签分区查询
SELECT location, AVG(current)
FROM meters 
WHERE ts >= '2023-10-01 00:00:00'
PARTITION BY location
ORDER BY location;-- 时间分区
SELECT _WSTART, location, AVG(current)
FROM meters 
WHERE ts >= '2023-10-01 00:00:00'
INTERVAL(1h)
PARTITION BY location;

8.2 用户定义函数

TDengine:

-- 创建用户定义函数
CREATE FUNCTION custom_avg AS '/path/to/libcustom.so' 
OUTPUTTYPE DOUBLE 
BUFSIZE 1024 
LANGUAGE 'C';-- 使用UDF
SELECT custom_avg(current) FROM d1001;-- 删除UDF
DROP FUNCTION custom_avg;

MySQL:

-- MySQL 存储过程
DELIMITER //
CREATE FUNCTION custom_avg(val FLOAT) 
RETURNS FLOAT
READS SQL DATA
DETERMINISTIC
BEGINDECLARE result FLOAT;-- 自定义逻辑RETURN result;
END //
DELIMITER ;

9. 系统管理差异

9.1 TDengine 集群管理

-- 显示数据节点
SHOW DNODES;-- 创建数据节点
CREATE DNODE '192.168.1.100:6030';-- 显示虚拟组
SHOW VGROUPS;-- 显示连接
SHOW CONNECTIONS;-- 显示查询
SHOW QUERIES;-- 杀死连接
KILL CONNECTION 123;-- 杀死查询
KILL QUERY '0x123456789';

9.2 权限管理

TDengine:

-- 创建用户(支持白名单)
CREATE USER test_user PASS 'password' 
SYSINFO 1 
HOST '192.168.1.0/24';-- 授权
GRANT READ ON power.* TO test_user;
GRANT WRITE ON power.meters TO test_user;-- 白名单管理
ALTER USER test_user ADD WHITELIST '10.0.0.0/8';
ALTER USER test_user DROP WHITELIST '192.168.1.0/24';

MySQL:

-- MySQL 用户管理
CREATE USER 'test_user'@'192.168.1.%' IDENTIFIED BY 'password';
GRANT SELECT, INSERT ON power.* TO 'test_user'@'192.168.1.%';
FLUSH PRIVILEGES;

10. 高级特性

10.1 无模式写入(TDengine 独有)

TDengine 支持多种无模式协议,这些在语法层面体现为特殊处理:

-- 虽然无模式写入通常通过API完成,但在SQL层面可以查看相关配置
SHOW VARIABLES LIKE '%schemaless%';-- 查看无模式写入的数据
SELECT * FROM information_schema.ins_tables 
WHERE db_name = 'test_schemaless';

10.2 数据压缩和存储

-- 创建表时指定压缩选项
CREATE TABLE compressed_data (ts TIMESTAMP,value FLOAT COMPRESS 'lz4'
) COMMENT 'High compression table';-- 数据库级别的压缩设置
CREATE DATABASE compressed_db COMP 2;  -- 压缩级别2

11. 总结

11.1 核心差异总结

功能类别TDengineMySQL主要差异点
数据模型超级表/子表模型单表模型TDengine 支持模板化表结构
时序特性内置时间窗口、插值需要复杂SQL实现TDengine 原生支持时序函数
写入方式多表批量写入、自动建表标准INSERT语句TDengine 支持更灵活的批量操作
连接类型ASOF、窗口连接标准连接TDengine 支持时序特有连接
聚合查询时间窗口聚合GROUP BY聚合TDengine 支持滑动窗口、会话窗口等
数据删除只支持时间范围删除支持任意条件删除TDengine 限制删除条件
数据更新通过重新插入实现UPDATE语句TDengine 无传统UPDATE
函数支持丰富的时序函数标准SQL函数TDengine 提供专业时序计算函数
伪列TBNAME、_WSTART等TDengine 提供窗口和表信息伪列
集群管理内置集群语法需要第三方工具TDengine 原生支持分布式管理

11.2 TDengine 独有特性

  1. 超级表/子表机制:模板化数据结构
  2. 时间窗口查询:INTERVAL、SESSION、STATE_WINDOW 等
  3. 插值查询:INTERP 和 FILL
  4. 多表批量写入:一条语句操作多个表
  5. 自动建表:写入时动态创建表
  6. 时序专用函数:FIRST、LAST、DIFF、TWA 等
  7. ASOF 和窗口连接:时序数据特有的连接方式

11.3 选择建议

  • 时序数据场景:选择 TDengine,充分利用其时序优化特性
  • 传统业务系统:选择 MySQL,成熟稳定的关系型数据库
  • 混合场景:考虑数据特性分别选择合适的数据库

通过理解这些语法差异,开发者可以更好地选择和使用适合的数据库系统,并进行相应的语法适配和迁移工作。

关于 TDengine

TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。

http://www.dtcms.com/a/395783.html

相关文章:

  • Mysql杂志(二十一)——Hash索引和二叉搜索树、AVL树
  • 什么是类的实例化
  • 西门子 S7-200 SMART PLC 实操案例:中断程序的灵活应用定时中断实现模拟量滤波(下)
  • STM32FreeRtos入门(二)——创建第一个多任务程序
  • Qt QML and Qt Quick 简述及例程
  • Linux 系统移植
  • 小杰机器学习(six)——概率论——1.均匀分布2.正态分布3.数学期望4.方差5.标准差6.多维随机变量及其分布
  • 【Linux】Ext系列文件系统(上)
  • 【ROS2】Beginner: Client libraries - 发布者、订阅者例子 C++ Python
  • AI设计功能性病毒:从DNA语言模型到精准杀菌实战
  • Qt 共享指针QSharedPointer与std::shared_ptr
  • Java课程 第02周 预习、实验与作业:Java基础语法2:面向对象入门
  • 词性标注技术漫谈:为词语赋予语法灵魂的旅程
  • K230基础-MicroPython
  • 网站访问问题:无法访问此网站、404
  • Redis 与Memcached 的对比
  • PyTorch 神经网络工具箱:核心原理与实践指南
  • 广义矩估计错误指定时的一个推导【续5】
  • 【STM32】ADC数模转换器
  • Tensorboard学习记录
  • Redis中常见数据结构底层实现结构是什么
  • 高频交易技术演进:从毫秒到纳秒的极限延迟优化之路
  • 从零开始搭建并部署一个基于Django和YOLO的智能模型项目
  • MySQL零基础学习Day2——数据库基础操作
  • 数学笔试选择题:题组1
  • Linux常用命令51——tail查看文件尾部内容
  • Django多数据库配置:mysql、mongo、redis、达梦
  • 图像拼接(反向拼接巨难,求指教!)
  • [免费]基于Python的深度学习音乐推荐系统(后端Django)【论文+源码+SQL脚本】
  • 南华 NHL-1 型加载减速工况法轻型柴油车烟度检测系统:技术解析与实战指南