从 MySQL 到 TDengine:一个真实项目的时序数据库选型之路
摘要:本文记录了一个真实项目从 MySQL 迁移到 TDengine 的全过程,分享选型思路、迁移方案和实际效果。
一、项目背景
某物联网平台,原有系统使用 MySQL 存储设备数据。随着设备数量增长,遇到严重性能问题:
日写入量:从 100 万条增长到 1 亿条
查询延迟:从 100ms 增长到 10 秒
存储空间:每月增长 500GB
系统稳定性:频繁出现连接超时
二、选型过程
2.1 问题分析
MySQL 在时序数据场景下的瓶颈:
B+ 树索引不适合时序数据
行式存储压缩率低
单表性能瓶颈
分区管理复杂
2.2 方案对比
方案 优点 缺点
MySQL 分库分表 技术成熟 运维复杂,扩展困难
InfluxDB 时序优化 集群版收费
TDengine 国产开源,高性能 需要学习成本
2.3 最终选择
选择 TDengine 的原因:
集群版完全开源,无商业限制
超级表机制适合设备建模
国产软件,技术支持响应快
社区活跃,文档完善
三、迁移方案
3.1 双写迁移策略
阶段 1(2 周):应用双写 MySQL + TDengine
阶段 2(1 周):验证数据一致性
阶段 3(1 天):切换读流量到 TDengine
阶段 4(1 月后):下线 MySQL
3.2 数据模型转换
MySQL 表结构:
CREATE TABLE device_data (
id BIGINT AUTO_INCREMENT,
device_id VARCHAR(32),
ts DATETIME,
temperature FLOAT,
pressure FLOAT,
PRIMARY KEY (id),
INDEX idx_device_ts (device_id, ts)
);
TDengine 超级表:
CREATE STABLE device_data (
ts TIMESTAMP,
temperature FLOAT,
pressure FLOAT
) TAGS (
device_id BINARY(32)
);
3.3 迁移脚本
import pymysql
import taos
class DataMigrator:
def init(self):
self.mysql_conn = pymysql.connect(host='localhost', database='iot')
self.td_conn = taos.connect(host='localhost', database='iot')
def migrate(self, batch_size=10000):
mysql_cursor = self.mysql_conn.cursor()
td_cursor = self.td_conn.cursor()
mysql_cursor.execute("SELECT * FROM device_data")
batch = []
for row in mysql_cursor.fetchall():
batch.append(row)
if len(batch) >= batch_size:
self.insert_batch(td_cursor, batch)
batch = []
if batch:
self.insert_batch(td_cursor, batch)
def insert_batch(self, cursor, batch):
values = ",".join([f"('{row[2]}', {row[3]}, {row[4]})" for row in batch])
cursor.execute(f"INSERT INTO device_data VALUES {values}")
四、迁移效果
| 指标 | MySQL | TDengine | 提升 |
|---|---|---|---|
| 写入性能 | 2 万条/秒 | 80 万条/秒 | 40x |
| 查询延迟 | 10 秒 | 50ms | 200x |
| 存储空间 | 500GB/月 | 50GB/月 | 降低 90% |
| 系统可用性 | 95% | 99.9% | +4.9% |
五、经验总结
1.充分测试:迁移前在测试环境验证 2 周
2.双写期不能省:确保数据一致性
3.监控要完善:实时监控迁移进度
4.回滚方案:准备应急回滚方案
关键词:时序数据库、TDengine、MySQL、数据迁移、选型

浙公网安备 33010602011771号