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 主要差异对比
特性 | TDengine | MySQL | 差异说明 |
---|---|---|---|
时间戳 | TIMESTAMP(必须) | TIMESTAMP(可选) | TDengine每表必须有 |
无符号整型 | 完整支持 | 完整支持 | 语法相同 |
字符串 | BINARY/NCHAR/VARCHAR/VARBINARY | CHAR/VARCHAR/TEXT系列 | TDengine无CHAR/TEXT |
Unicode | NCHAR(固定4字节) | 字符集配置 | TDengine固定编码 |
JSON | 仅TAGS支持 | 普通列支持 | TDengine限制更严 |
几何 | GEOMETRY(2D) | 完整空间类型 | TDengine仅2D |
日期时间 | 仅TIMESTAMP | DATE/TIME/DATETIME | TDengine专注时序 |
枚举集合 | 不支持 | ENUM/SET | TDengine不支持 |
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替代 | 说明 |
---|---|---|
CHAR | BINARY | 固定长度字符串 |
TEXT | NCHAR | 长文本内容 |
DATE/TIME | TIMESTAMP | 统一时间类型 |
ENUM | TINYINT | 枚举值映射 |
SET | VARCHAR | 集合值序列化 |
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 核心差异总结
功能类别 | TDengine | MySQL | 主要差异点 |
---|---|---|---|
数据模型 | 超级表/子表模型 | 单表模型 | TDengine 支持模板化表结构 |
时序特性 | 内置时间窗口、插值 | 需要复杂SQL实现 | TDengine 原生支持时序函数 |
写入方式 | 多表批量写入、自动建表 | 标准INSERT语句 | TDengine 支持更灵活的批量操作 |
连接类型 | ASOF、窗口连接 | 标准连接 | TDengine 支持时序特有连接 |
聚合查询 | 时间窗口聚合 | GROUP BY聚合 | TDengine 支持滑动窗口、会话窗口等 |
数据删除 | 只支持时间范围删除 | 支持任意条件删除 | TDengine 限制删除条件 |
数据更新 | 通过重新插入实现 | UPDATE语句 | TDengine 无传统UPDATE |
函数支持 | 丰富的时序函数 | 标准SQL函数 | TDengine 提供专业时序计算函数 |
伪列 | TBNAME、_WSTART等 | 无 | TDengine 提供窗口和表信息伪列 |
集群管理 | 内置集群语法 | 需要第三方工具 | TDengine 原生支持分布式管理 |
11.2 TDengine 独有特性
- 超级表/子表机制:模板化数据结构
- 时间窗口查询:INTERVAL、SESSION、STATE_WINDOW 等
- 插值查询:INTERP 和 FILL
- 多表批量写入:一条语句操作多个表
- 自动建表:写入时动态创建表
- 时序专用函数:FIRST、LAST、DIFF、TWA 等
- ASOF 和窗口连接:时序数据特有的连接方式
11.3 选择建议
- 时序数据场景:选择 TDengine,充分利用其时序优化特性
- 传统业务系统:选择 MySQL,成熟稳定的关系型数据库
- 混合场景:考虑数据特性分别选择合适的数据库
通过理解这些语法差异,开发者可以更好地选择和使用适合的数据库系统,并进行相应的语法适配和迁移工作。
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。