首页 > 数据库 > > 时序数据库 QuestDB 特性解析
QuestDB 是一款针对时序数据实时处理优化的关系型列存数据库。
QuestDB 采用列存(column-based)存储模型,表里的数据按列存储到不同的文件,每次新的写入数据追加到文件末尾,保持跟写入顺序一致。
QuestDB 采用列存模型,每个列存储到不同的文件,文件通过 mmap 方式映射到内存,每次写入直接在映射内存大末尾追加数据,非常高效,对于定长类型列,通过行号就能固定定位到数据位置;针对变长类型列,每个列除了对应一个数据文件,还要对应一个索引文件,索引文件的记录为定长,指向各个记录在数据文件的位置。

CREATE TABLE IF NOT EXISTS trades(name STRING, value INT);
INSERT INTO trades VALUES('abc', 123456);
$tree trades
.
├── default
│ ├── name.d
│ ├── name.i
│ └── value.d
├── _meta
└── _txnQuestDB 能保证每次写入的表级别的原子性,每张表会单独维护 last_committed_record_count(txn_count), 读取时 QuestDB 确保不会读到行号超过 txn_count 的记录,确保与正在写入事务的隔离性,当新记录的各个列都更新成功时,QuestDB commit 事务更新 last_committed_record_coun提交事务。数据的持久性级别可以在 commit 时指定不同的参数,是每次提交持久化还是周期性做持久化。


QuestDB 支持一种 designated timestamp 的特殊时间戳列,存储时可以根据该时间戳来进行分区,从而针对时间范围的查询做优化。
designated timestamp 列designated timestamp 列designated timestamp 列指定 partition 策略,加速时序查询designated timestamp 列不支持乱序写入(这个极大的限制了使用场景)
QuestDB 为简化时序查询的表达,对 SQL 进行了扩展。
查询最新时间点数据
# 查询传感器最新的温度指标
SELECT sensorName, tempC
FROM sensors
LATEST BY sensorName;对时序数据范围进行降采样聚合计算
# 查询传感器每5分钟的温度平均值
SELECT timestamp, avg(tempC)
FROM sensors
SAMPLE BY 5m;# 按时间点/时间范围检索
SELECT timestamp, tempC
FROM sensors
WHERE timestamp = '2020-06-14;1M';QuestDB 支持自动对数据按时间进行分区存储,分区规则只能在 designated timestamp 列上指定,例如按天、按周、按月分区等规则,分区后,每个分区的数据存储到单独的目录。数据按时间分区存储后,根据时间范围的查询能快速的过滤数据,同时也能方便的实现 TTL 机制。

QuestDB 支持 SYMBOL 类型,对于取值重复度高的字符串列,为了避免重复的存储相同的内容,QuestDB 通过字典映射,将 String 映射为整数存储,极大的提升存储效率;SYMBOL 列类似时序数据库里的 Tag。QuestDB 支持对 SYMBOL 列建索引,索引的方式类似于 InfluxDB 等时序数据库里实现的倒排索引; 通过索引能极大的极速查询。

QuestDB 支持 Rest API 方式访问,同时兼容 PostgreSQL 访问协议,以及 InfluxDB 写入的访问协议。QuestDB 还自带 Web Console,方便数据库的基本访问,值得学习。

designated timestamp 列的乱序写入,极大的限制应用场景。https://zhuanlan.zhihu.com/p/349786163
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69999831/viewspace-3150673/ ,如需转载,请注明出处,否则将追究法律责任。