文件型时序数据库怎么做到存储又快又省空间,查询也不拖沓的那些事儿
- 问答
- 2026-01-23 08:00:56
- 3
(根据“知乎专栏:时序数据那些事儿”和“B站UP主‘程序员聊架构’的相关视频讲解整理)
文件型时序数据库要做到又快又省空间,查询还不拖沓,核心思路其实有点像我们日常生活中整理房间和做笔记的方法,它不是靠某一种神奇的“黑科技”,而是通过一系列环环相扣的、非常务实的设计组合拳来实现的。
先解决“写”的问题:像记流水账,而不是写作文
想象一下,你每分钟都要记录一次温度传感器的读数,最笨的方法是,每次读数都打开一个文件,找到文件末尾,写上“时间戳,温度值”,然后保存关闭,下一分钟再来一遍,这样频繁开关文件,速度肯定快不起来。
文件型时序数据库的做法是“追加写”,它会把一段时间内(比如最近一小时)的所有新数据,先在内存里攒着,就像我们记笔记先写在草稿纸上,等攒到一定数量(比如一万条),或者时间到了(比如每小时整点),再一次性、顺序地写入到磁盘的一个文件中,这个过程就像把草稿纸上潦草的笔记,工整地抄写到一本专门的笔记本新的一页上。
(来源:B站UP主“程序员聊架构”视频中关于WAL预写日志和MemTable的通俗解释)这样做的好处是:

- 写得快:磁盘最怕的是磁头来回跳动找位置(随机写),而这种追加写的方式,磁头几乎不用移动,顺序地往下写,速度是机械硬盘和固态硬盘都最喜欢的模式,速度能达到最高。
- 保证数据安全:在把内存数据写入主文件之前,数据库通常会先把它写到一个叫“预写日志(WAL)”的特殊文件里,这个日志只追加,不修改,万一系统崩溃,内存数据丢了,还能从这个日志里恢复,确保了数据不会丢失。
再解决“存”的问题:像压缩行李箱,而不是塞麻袋
数据光写进去快还不够,如果原样存储,很快就会占满硬盘,时序数据有个特点:很多数据点之间的变化很小,比如温度,可能连续好几分钟都只在小数点后几位波动。
文件型时序数据库利用了这一点,进行了强大的压缩。

- 列式存储:传统数据库存数据是一行一行存,时间1,设备A,温度25.1;时间2,设备A,温度25.2……”,而时序数据库会按列存储,把所有的“时间”放在一起,所有的“设备ID”放在一起,所有的“温度值”放在一起。(来源:知乎专栏文章提及的列存优势)这样做的好处是,同一列的数据类型相同,压缩算法可以发挥最大效果,比如温度值这一列,数字都非常接近,用一些简单的差分编码(只存储相邻两个数值的差异,比如0.1)和位打包技术,就能极大地缩小空间。
- 专门的数据压缩算法:针对浮点数、整数、字符串等不同类型的数据,有像Gorilla、Delta-of-Delta等多种高效的压缩算法,经过这些处理,原始数据通常能被压缩到原来的十分之一甚至二十分之一,非常省空间。
最后解决“查”的问题:像查字典和看目录,而不是一页页翻书
数据存得又密又小,查询时如果要从头到尾扫描,那会慢得无法忍受,必须给数据文件建立“索引”和“目录”。
- 分级存储与索引:数据库不会在每一条数据上都建精细的索引,那样索引本身就会大得惊人,常见的做法是:
- 粗粒度索引:针对每个数据文件(比如刚才说的每小时一个的文件),记录下这个文件里包含了哪个设备、在哪个时间范围内的数据,查询时,先根据时间范围和设备名,快速定位到可能包含目标数据的少数几个文件,而不是扫描全部文件,这就像一本书的章节目录,帮你快速定位到第几章。
- 数据分区:按照时间(比如每天或每月)或设备标签将数据存放到不同的目录下,查询时,系统可以直接跳过那些明显不相关的数据分区,大大减少需要扫描的数据量。
- 利用查询模式:绝大多数时序数据查询都是“时间范围查询”,查询设备A在过去一小时的最高温度”,数据库在设计时就会优先优化这类查询,由于数据是按时间顺序存储的,一旦找到了目标文件的起始位置,就可以像放磁带一样顺序读取,速度非常快,对于聚合查询(如最大值、平均值),数据库还会预先对每个数据块计算并存储一些统计信息(如最大值、最小值),如果查询的范围覆盖整个数据块,可以直接用这个统计值,连数据块都不用解压打开。
定期“大扫除”:合并与过期清理
随着时间推移,会产生很多小文件,查询时要打开的文件太多,效率会下降,很久以前的数据可能已经不需要了。
- 文件合并:数据库会定期将一些小文件(比如多个一小时的文件)合并成一个大文件(比如一个一天的文件),合并过程中,会重新进行排序和压缩,使得数据存储更紧凑,查询时需要打开的文件数量变少,效率更高。
- 数据过期策略:用户可以设置数据的保留策略(比如只保留最近30天的数据),数据库会像扫地一样,自动定期清理那些过期的数据文件,释放磁盘空间。
文件型时序数据库的“快、省、好”不是魔法,而是通过追加写优化写入速度,列式存储和压缩优化存储空间,分级索引和数据分区优化查询效率,再辅以定期合并与清理来维持系统长期高性能,这一整套方法,都是紧密围绕时序数据“大量写入、少量更新、按时间顺序读取”的特点量身定制的。
本文由瞿欣合于2026-01-23发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/84341.html
