当前位置: 首页 > news >正文

时序数据库详解

时序数据库详解

1. 时序数据库概述

时序数据库(Time Series Database)专门存储和时间相关的数据,如监控指标、传感器数据、金融数据等。

2. InfluxDB

2.1 核心概念

  • Measurement:相当于表
  • Tag:索引字段,用于过滤
  • Field:数据字段
  • Timestamp:时间戳

2.2 InfluxQL

-- 插入数据 INSERT cpu,host=server1,region=us value=0.5 1672531200000000000 -- 查询数据 SELECT * FROM cpu WHERE time > now() - 1h -- 聚合查询 SELECT MEAN(value) FROM cpu WHERE time > now() - 1h GROUP BY time(5m) -- 连续查询 CREATE CONTINUOUS QUERY cpu_mean ON mydb BEGIN SELECT MEAN(value) INTO cpu_mean FROM cpu GROUP BY time(5m), * END

2.3 Go客户端

import "github.com/influxdata/influxdb-client-go/v2" client := influxdb2.NewClient("http://localhost:8086", "token") writeAPI := client.WriteAPIBlocking("my-org", "my-bucket") p := api.NewPoint("cpu", api.Tag("host", "server1"), api.Tag("region", "us"), api Fields("load", 0.5)) writeAPI.WritePoint(ctx, p) client.Close()

3. TimescaleDB

3.1 创建超表

-- 创建超表 CREATE TABLE conditions ( time TIMESTAMPTZ NOT NULL, location TEXT NOT NULL, temperature DOUBLE PRECISION ); SELECT create_hypertable('conditions', 'time'); -- 创建索引 CREATE INDEX ON conditions (location, time DESC);

3.2 写入数据

INSERT INTO conditions (time, location, temperature) VALUES ('2023-01-01 00:00:00', 'NYC', 5.0);

3.3 聚合查询

-- 时间聚合 SELECT time_bucket('1 hour', time) AS hour, AVG(temperature) FROM conditions WHERE location = 'NYC' GROUP BY hour ORDER BY hour DESC LIMIT 10; -- 降采样 SELECT time_bucket('1 day', time) AS day, MAX(temperature) - MIN(temperature) AS temp_range FROM conditions GROUP BY day ORDER BY day DESC;

4. QuestDB

4.1 快速写入

-- 创建表 CREATE TABLE sensors ( ts TIMESTAMP, sensor_id SYMBOL, temperature DOUBLE, humidity DOUBLE ) TIMESTAMP(ts) PARTITION BY DAY; -- 批量写入 INSERT INTO sensors VALUES ('2023-01-01T00:00:00.000Z', 'sensor_1', 22.5, 65.0), ('2023-01-01T00:00:00.000Z', 'sensor_2', 23.1, 63.5);

4.2 时间序列查询

-- 最近24小时数据 SELECT * FROM sensors WHERE ts > now() - 24h ORDER BY ts DESC; -- 按传感器聚合 SELECT sensor_id, AVG(temperature), MAX(temperature) FROM sensors WHERE ts > now() - 7d GROUP BY sensor_id;

5. Go客户端选择

5.1 InfluxDB Go客户端

import "github.com/influxdata/influxdb-client-go/v2" client := influxdb2.NewClient("http://localhost:8086", "token") defer client.Close() writeAPI := client.WriteAPIBlocking("my-org", "my-bucket") point := api.NewPoint("measurement"). AddTag("tag1", "value1"). AddField("field1", 10.5) writeAPI.WritePoint(ctx, point)

5.2 TimescaleDB Go客户端

import ( "github.com/jackc/pgx/v4" "github.com/timescale/timescaledb-go/sql" ) conn, _ := pgx.Connect(ctx, "postgres://user:pass@localhost:5432/db") defer conn.Close() // 创建超表 sql.CreateHypertable(ctx, conn, "conditions", "time")

6. 数据保留策略

6.1 InfluxDB保留策略

-- 创建保留策略 CREATE RETENTION POLICY "7d" ON "mydb" DURATION 7d REPLICATION 1 SHARD DURATION 1d DEFAULT; -- 修改保留策略 ALTER RETENTION POLICY "7d" ON "mydb" DURATION 30d;

6.2 TimescaleDB数据保留

-- 添加数据保留策略 SELECT add_retention_policy('conditions', INTERVAL '7 days');

7. 降采样与聚合

7.1 连续查询降采样

-- InfluxDB降采样 CREATE CONTINUOUS QUERY "1h_avg" ON "mydb" BEGIN SELECT MEAN(temperature) AS temp INTO "conditions_1h" FROM "conditions" GROUP BY time(1h), sensor_id END;

7.2 TimescaleDB降采样

-- 创建降采样表 CREATE TABLE conditions_1h ( time TIMESTAMPTZ NOT NULL, sensor_id TEXT NOT NULL, temp_avg DOUBLE PRECISION, temp_min DOUBLE PRECISION, temp_max DOUBLE PRECISION ); SELECT create_hypertable('conditions_1h', 'time'); -- 使用 refresh_continuous_aggregate 定期刷新

8. 数据压缩

8.1 TimescaleDB压缩

-- 启用压缩 ALTER TABLE conditions SET ( timescaledb.compress, timescaledb.compress_segmentby = 'sensor_id' ); -- 添加压缩策略 SELECT add_compression_policy('conditions', INTERVAL '7 days');

8.2 InfluxDB TSM压缩

TSM(Time-Structured Merge Tree)文件格式提供高效压缩。

9. 总结

时序数据库是处理时间序列数据的利器,InfluxDB、TimescaleDB、QuestDB各有特点。选择时需要考虑写入性能、查询性能、数据保留策略、压缩比等因素,并结合具体业务场景进行评估。

http://www.jsqmd.com/news/792196/

相关文章:

  • 软工5月10号
  • Display Driver Uninstaller (DDU):彻底清理显卡驱动的终极解决方案
  • STM32 SDIO+PCM5102成功播放《义妹》
  • day04补发
  • 深入了解Python并发编程
  • 如何通过Noto Emoji实现跨平台表情符号统一:技术原理与应用实践
  • Qt/C++实战:手把手教你用QCustomPlot实现动态刷新热力图(模拟实时数据)
  • MySQL高级特性:索引优化详解
  • 2026年4月优质的初中效袋式过滤器批发厂家推荐,防潮设计适应潮湿环境 - 品牌推荐师
  • Redis数据结构与性能优化详解
  • 使用本地浏览器打开远程服务器生成的网页——详细教程
  • 打破语言壁垒:Translumo屏幕实时翻译工具的终极使用指南
  • 2026 年 Q1 全球互联网中断报告:断网、停电与战争
  • 20253221 2025-2026-2 《Python程序设计》实验3报告
  • Python函数中的全局变量详解
  • 量子计算机来了,你的企业网络隧道还安全吗?
  • PostgreSQL高级特性详解
  • Redis学习8 Redis数据结构(1)
  • 基于Vue.js与AI对话的智能思维导图生成器开发实践
  • 终极解决方案:如何快速批量转换GBK到UTF-8编码文件
  • 一次例行密钥轮换,让数百万德国域名集体蒸发
  • 独立开发者工具箱:2026年全栈与AI应用高效开发技术栈指南
  • MongoDB聚合与查询优化详解
  • 如何在 Docker 容器中部署企业微信机器人服务保证高可用
  • 31_AI短片实战第四弹:主观视角空间控制与分屏快速剪辑的AI生成策略(附提示词)
  • 高管求职渠道公司实测:4家机构核心能力对比评测 - 得赢
  • 两次全球宕机之后,Cloudflare 用半年时间重建了什么
  • 2026届最火的AI写作平台推荐榜单
  • Logseq AI助手插件:在知识管理笔记中集成ChatGPT智能写作与编辑
  • hls::stream<ap_uint<DW * NPPC>> src,报错原因分析