一、前言
在学习 Apache IoTDB 之前,我们先要搞清楚一个问题:
为什么已经有 MySQL、Oracle、PostgreSQL 这些数据库了,还需要 IoTDB 这种时序数据库?
原因很简单:不同类型的数据,适合用不同类型的数据库存储。
比如用户信息、订单信息、商品信息,这些数据结构比较固定,关系也比较清晰,非常适合使用 MySQL 这类关系型数据库。
但是在物联网场景中,数据往往是这样的:
2026-07-24 10:00:01 设备A 温度 26.5
2026-07-24 10:00:02 设备A 温度 26.6
2026-07-24 10:00:03 设备A 温度 26.7
2026-07-24 10:00:04 设备A 湿度 61.2
这类数据有一个非常明显的特点:
每一条数据都和时间有关。
这种按照时间不断产生的数据,就叫做 时间序列数据,简称 时序数据。
IoTDB 就是专门用来存储、管理、查询这类时序数据的数据库。
二、什么是时序数据?
时序数据,就是按照时间顺序不断产生的数据。
在生活中,时序数据其实非常常见:
| 场景 | 数据举例 |
|---|---|
| 工厂设备 | 温度、压力、转速、电流、电压 |
| 智能家居 | 温湿度、用电量、开关状态 |
| 车辆系统 | 速度、油耗、电池电量、GPS |
| 服务器监控 | CPU、内存、磁盘、网络流量 |
| 气象监测 | 温度、湿度、风速、降雨量 |
它们都有一个共同特点:
时间 + 对象 + 指标值
比如:
时间:2026-07-24 10:00:00
设备:device01
指标:temperature
值:26.5
可以理解为:
某个设备,在某个时间点,产生了某个指标值。

三、IoTDB 是什么?
IoTDB 的全称是:
Internet of Things Database
也就是 物联网数据库。
Apache IoTDB 是一个面向工业物联网场景的时序数据库,主要用于采集、存储、管理和分析物联网时序数据。
简单来说,IoTDB 适合处理这类问题:
设备很多
指标很多
数据一直产生
数据量非常大
查询经常按时间范围查询
需要统计某段时间内的最大值、最小值、平均值
比如一个工厂有 1000 台设备,每台设备每秒上传一次温度、电压、电流、转速等数据。一天产生的数据量就会非常大。
这时候如果全部塞进普通关系型数据库,后期查询和存储压力会越来越明显。
IoTDB 就是为这种场景设计的。
四、IoTDB 在物联网系统中的位置
IoTDB 通常位于设备采集层和业务分析层之间。
设备不断上传数据,IoTDB 负责存储这些数据;后端系统、可视化大屏、报表系统再从 IoTDB 中查询数据。

从这张图可以看出,IoTDB 的核心作用就是:
把设备连续产生的时序数据高效地存下来,并且方便后续查询和分析。
五、普通数据库能不能存时序数据?
答案是:
能存,但不一定适合。
比如用 MySQL 存设备温度数据,可以设计一张表:
CREATE TABLE sensor_data (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
device_id VARCHAR(50),
sensor_type VARCHAR(50),
value DOUBLE,
collect_time DATETIME
);
然后插入数据:
INSERT INTO sensor_data(device_id, sensor_type, value, collect_time)
VALUES ('device01', 'temperature', 26.5, '2026-07-24 10:00:00');
这样当然可以存。
但是问题在于,时序数据通常有几个特点:
- 数据量非常大
- 写入频率非常高
- 主要按照时间范围查询
- 很少修改历史数据
- 经常需要聚合统计,比如平均值、最大值、最小值
- 设备和指标数量可能不断增加
普通关系型数据库不是不能做,而是做起来会越来越吃力。
六、时序数据库和普通数据库的区别
可以先看一个简单对比:
| 对比项 | 普通关系型数据库 | 时序数据库 IoTDB |
|---|---|---|
| 典型代表 | MySQL、Oracle、PostgreSQL | Apache IoTDB |
| 主要数据 | 用户、订单、商品等业务数据 | 设备、传感器、监控指标 |
| 数据特点 | 关系复杂,增删改查都有 | 按时间持续写入,查询多按时间范围 |
| 写入方式 | 普通业务写入 | 高频连续写入 |
| 查询方式 | 按主键、外键、条件查询 | 按时间、设备、指标查询 |
| 历史数据 | 可能经常修改 | 一般很少修改 |
| 聚合统计 | 可以做,但大数据量下压力较大 | 更适合时间窗口聚合 |
| 存储优化 | 面向通用数据 | 面向时间序列数据压缩和查询优化 |
一句话总结:
普通数据库更适合存业务关系数据,IoTDB 更适合存设备连续产生的时序数据。

七、用一个例子理解 IoTDB 的数据模型
假设有一个工厂,里面有一台设备 device01,这台设备会采集两个指标:
temperature:温度
humidity:湿度
在 IoTDB 中,可以把它理解成下面这种结构:
root.factory.device01.temperature
root.factory.device01.humidity
其中:
| 名称 | 含义 |
|---|---|
| root | 根节点 |
| factory | 工厂 |
| device01 | 设备 |
| temperature | 温度指标 |
| humidity | 湿度指标 |
这种结构很适合物联网场景。因为现实中的设备本来就是分层管理的:
集团 -> 工厂 -> 车间 -> 设备 -> 传感器指标
IoTDB 使用类似目录树的方式管理这些数据,对初学者来说比较直观。

八、MySQL 表结构和 IoTDB 路径结构对比
如果用 MySQL,我们通常会把数据放在表里:
sensor_data 表
每一行是一条采集数据。
如果用 IoTDB,我们更关注的是:
某个设备的某个指标,随着时间变化产生的一组数据
比如:
device01 的 temperature 是一条曲线
device01 的 humidity 是一条曲线
device02 的 temperature 也是一条曲线
每条曲线都会随着时间不断产生新数据。

简单来说:
MySQL 更像是在管理一张张表
IoTDB 更像是在管理一条条随时间变化的曲线
这也是时序数据库和普通数据库在思路上的一个重要区别。
九、IoTDB 适合哪些场景?
IoTDB 特别适合下面这些场景。
1. 工业设备数据采集
比如采集设备的:
温度、湿度、压力、转速、电流、电压、功率
这些数据都是连续产生的,非常适合用 IoTDB 存储。
2. 物联网平台
智能水表、电表、燃气表、智能家居设备,都会定时上传数据。
比如:
每 5 秒上传一次用电量
每 10 秒上传一次温度
每 1 分钟上传一次设备状态
3. 监控系统
服务器监控也属于典型时序数据:
CPU 使用率
内存使用率
磁盘使用率
网络流量
这些指标本质上也是按照时间不断变化的数据。
4. 数据分析和可视化
IoTDB 不只是能存数据,还可以按时间范围查询、聚合统计,非常适合做曲线图、报表和告警系统。

十、什么时候不适合用 IoTDB?
虽然 IoTDB 很适合时序数据,但并不是所有场景都应该用它。
下面这些场景更适合普通关系型数据库:
| 场景 | 更适合的数据库 |
|---|---|
| 用户登录、权限管理 | MySQL |
| 订单、支付、商品 | MySQL |
| 复杂事务处理 | MySQL / PostgreSQL |
| 多表关联查询 | MySQL / PostgreSQL |
| 设备采集数据 | IoTDB |
| 传感器历史曲线 | IoTDB |
| 时间范围聚合统计 | IoTDB |
所以实际项目中,经常是两种数据库一起使用:
MySQL 存业务数据
IoTDB 存设备时序数据

十一、总结
IoTDB 是一个专门面向物联网场景的时序数据库。
它主要解决的问题是:
大量设备
高频写入
按时间查询
历史数据统计
设备指标分析
普通数据库不是不能存时序数据,而是在数据量越来越大、写入越来越频繁、查询越来越偏向时间范围统计时,时序数据库会更加合适。
最后可以简单记住一句话:
MySQL 适合存业务关系数据,IoTDB 适合存设备时序数据。
下一篇文章我们可以继续学习:
IoTDB 安装与启动:Windows / Docker 快速跑起来
参考资料
- Apache IoTDB 官网:IoTDB Website
- Apache IoTDB 官方文档:Index of /UserGuide/latest

132

被折叠的 条评论
为什么被折叠?



