十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

01-时序数据库核心思想:海量设备点位、时序数据存储原理

01-时序数据库核心思想:海量设备点位、时序数据存储原理 时序数据库核心思想海量设备点位、时序数据存储原理大家好我是黒漂技术佬。今天我们不写Hello World我们来聊聊一个更有意思的话题——时序数据库。如果你做过物联网、工控、智慧农业或者仅仅是对数据库这个词感到好奇这篇文章会让你从时序数据是什么一路走到我为什么需要它。什么是时序数据时序数据全称时间序列数据通俗来说就是带时间戳的数据。它不是今天你吃了什么、昨天你买了什么这种一次性记录而是一串按时间顺序产生、且时间轴本身就是核心信息的数据。举个例子你在智慧农业大棚里放了一个温湿度传感器每分钟上报一次数据2026-07-30 10:00:00, 温度26.3°C, 湿度72% 2026-07-30 10:01:00, 温度26.5°C, 湿度71% 2026-07-30 10:02:00, 温度26.7°C, 湿度70% ...这三条记录包含了三个要素时间戳什么时候采集的指标温度、湿度用数据库术语叫 field字段标签哪个大棚、哪台设备、传感器型号用数据库术语叫 tag标签时序数据的典型特征写入频繁、按时间范围查询、几乎不修改、数据量巨大。一个无人售货柜可能有20个传感器温度、湿度、电流、电压、门磁、振动、红外每隔5秒上报一次——一天就产生约35万条数据。1000台设备呢自己算。传统数据库的哭诉很多人第一反应这不就是一张表加个时间戳字段吗MySQL 不就能存能存确实是能存。但能存和能好好用是两回事。我们来还原一下传统关系型数据库面对时序数据的真实写照场景存储1000台无人售货柜的温度数据每台每秒上报一次。写入瓶颈MySQL 的 InnoDB 引擎基于 BTree 索引每次写入都要维护索引结构。1000条/秒的并发写入索引页分裂频繁写入延迟飙升。你用INSERT疯狂往里塞MySQL 在索引树上满头大汗。聚合查询慢如龟想查过去24小时每台设备的平均温度你写个GROUP BY device_id, HOUR(timestamp)MySQL 会把几千万行数据全部扫一遍再聚合。等结果出来茶都凉了。存储膨胀时序数据很少修改、很少删除但关系型数据库把这部分能力开销全背上了undo log、事务锁、行级锁用不上还占空间。历史数据清理麻烦时序数据有时效性——3个月前的秒级数据基本没用了。在 MySQL 里你得写定时任务DELETE FROM ... WHERE timestamp ...大表删除是个噩梦锁表、慢查询、碎片整理一套连招下来运维都哭了。本质上传统数据库是为**事务处理OLTP**设计的增删改查均衡、数据一致性要求高、单条操作多。而时序数据的访问模式完全相反写多读少、读是全量扫、几乎不删不改。拿锤子拧螺丝不是不能是费力不讨好。时序数据库的核心设计思想时序数据库就是为这种场景量身定做的。它的核心设计思想可以归纳为四点1. 时间为第一索引在时序数据库中时间不是普通字段而是一等公民。数据的物理存储按时间有序排列相当于提前帮你按时间排好队。查过去一小时的数据不需要全表扫描直接定位到时间区间、顺序读出即可。这大幅降低了范围查询的 I/O 开销。实际实现上时序数据库通常采用LSM-TreeLog-Structured Merge Tree日志结构合并树或类 LSM 的存储引擎。写操作先落到内存缓冲区积攒到一定量后批量刷盘形成按时间排序的不可变数据文件。这比 BTree 的随机写快了一个数量级。2. 列式存储优化聚合时序查询的典型模式是“我想看设备A在过去24小时的平均温度”。注意你只关心温度这一列不关心湿度、电流、电压。如果是行式存储MySQL 那种数据库必须把整行数据全读出来再挑出温度列列式存储则直接跳过无关列只读温度这一列的数据。列式存储还有另一个好处同列数据连续存储压缩比极高。温度值在26°C上下波动用差值编码Delta Encoding或游程编码Run-Length Encoding压缩率可以达到10:1甚至更高。3. 高吞吐写入时序数据库专门优化了写入路径。以 InfluxDB 为例它采用TSMTime-Structured Merge Tree存储引擎数据先写入 WALWrite-Ahead Log预写日志保证不丢数据同时写入内存缓存Cache“写完内存就返回”延迟极低后台线程定期将缓存数据压缩、编码后持久化到磁盘这种写内存 批量刷盘的策略让单节点轻松支撑百万点/秒的写入吞吐。对比 MySQL 的逐行写完全不在一个量级。4. 自动过期时序数据的时效性很强——三个月前的秒级温度数据基本没啥用了。时序数据库内置了保留策略Retention Policy你只需要设定保留30天数据库会自动清理过期数据。不是标记删除、不是软删除而是直接删文件级的数据块效率极高且不影响正在进行的写入。某些数据库如 InfluxDB 1.x还支持下采样Downsampling把过去30天的秒级数据自动聚合成小时级数据并保留更久。这样既保留了历史趋势又控制了存储成本。时序数据库 vs 关系型数据库对比维度时序数据库关系型数据库核心索引时间主键通常自增ID写入模式批量顺序追加随机增删改存储引擎LSM-Tree / TSMBTree压缩率极高10:1一般2:1~3:1聚合查询毫秒级秒级甚至分钟级数据过期内置自动删除需手动维护事务支持弱 / 无ACID 完整支持适合场景监控、IoT、工控电商、ERP、OA注这不是谁更好的问题是用对工具的问题。时序数据库不是替代 MySQL而是 MySQL 不擅长的领域。主流时序数据库概览InfluxDBGo最流行的开源时序数据库生态完善Telegraf 采集器 InfluxDB 存储 Grafana 展示号称 TICK 技术栈。本文系列的主角。TDengineC国产高性能时序数据库专为 IoT 场景优化一个设备一张表的设计理念和超级表的创新让它在物联网领域很能打。PrometheusGo云原生监控的事实标准专为监控告警设计pull 模式采集。K8s 集群监控的首选。TimescaleDBC基于 PostgreSQL 的时序扩展。如果你团队对 PG 很熟又需要时序能力这是一个优雅的选择。工控/物联网场景为什么需要时序数据库回顾一下前面无人售货柜的例子。一个中等规模的无人零售运营商可能部署500台售货柜每台柜子上有20个传感器每5秒上报一次。这意味着写入速率500 × 20 ÷ 5 2000点/秒日增数据2000 × 86400 约1.7亿条记录月增数据约50亿条记录在这种规模下传统数据库已经很难应付。而时序数据库单节点「百万点/秒」的写入能力处理这2000点/秒就像玩一样。更关键的是查询场景。当运营人员想了解所有售货柜过去一周的每日平均温度时序数据库能用聚合函数在秒级返回结果。放在关系型数据库上你可能需要建一堆索引、写存储过程、甚至上中间结果表才能勉强达到可用水平。场景落地无人售货柜传感器数据存储其实前面已经铺垫了太多这里直接给一个落地的数据模型草图让你直观感受一下假设一台无人售货柜上报以下数据设备ID: cabinet-001 位置: 深圳南山科技园 传感器数据每5秒: - temperature: 26.3°C柜内温度 - humidity: 72%柜内湿度 - current: 2.1A整机电流 - voltage: 219.5V供电电压 - power: 462W整机功率 - door_open_count: 15当日开门次数累计在时序数据库中这会被建模为一个measurement可以理解为一张表比如叫cabinet_metrics每条记录包含时间戳和上述所有字段。查询cabinet-001 过去24小时温度曲线的时间可能只需要几十毫秒。更棒的是时序数据库通常和监控面板天然集成。InfluxDB Grafana 的组合可以直接把温度曲线、电流波动这些数据变成可视化图表运维人员喝着咖啡就能监控所有售货柜的健康状态。好了这篇就到这里。下一篇我们正式入门 InfluxDB从安装到第一行数据写入手把手带你实操。黒漂技术佬下篇见。
返回列表