巨松时序数据库(以下称PinusDB)是一款针对物联网智能设备数据特点研发的具备高性能、大容量、低成本、稳定可靠的数据库。提供高效的写入、读取、聚合统计功能。广泛应用于物联网(IoT)设备监控、智慧城市、智慧物流、环境监测等具备时序特点的场景。
PinusDB针对传感数据基于时序的特点使用特殊的方式处理、存储。解决海量物联网设备高频率数据处理,降低企业开发、运维、管理成本。
1. 产品特点
高性能
具备高效的读写能力,普通PC机写入性能超过20万条/秒;针对内存中的数据筛选、统计性能达到1500万条/秒;针对某台设备在某段时间的统计分析性能超过100万条/秒。优化数据读写机制,充分发挥硬件性能。
大容量
单机单表能存储百亿级数据量,高达32T数据文件。
简单易用
基于类似关系库表的数据模型,理解、使用更简单。用户使用类似标准SQL进行数据操作,数据筛选、统计更方便。
2. 支持的数据类型PinusDB支持如下几种数据类型:
类型 |
长度(字节) |
说明 |
tinyint |
1 |
1字节整型,值域[ -2^7, 2^7 - 1 ] |
smallint |
2 |
2字节整型,值域[ -2^15, 2^15 - 1 ] |
int |
4 |
4字节整型,值域[ -2^31, 2^31 -1 ] |
bigint |
8 |
8字节整型,值域[ -2^63, 2^63 - 1 ] |
float |
4 |
单精度浮点型 |
double |
8 |
双精度浮点型 |
string |
|
字符串,变长,整条数据不超过8K |
blob |
|
二进制,变长,整条数据不超过8K |
3. 支持的字符集
PinusDB只支持UTF8字符集,所有字符串都需要转成UTF8再存储到数据库。
4. 字面量
- 数值
整数:使用十进制数字书写,可以在前面加负号(-)表示负值。
浮点数:使用点(.)作为整数和小数的分割,也可以在前面加负号(-)表示负值。
注意:不支持使用十六进制数值的书写。
- 字符串
字符串是使用单引号'或双引号"包含的字符序列。若使用单引号将字符串引起来字符串出现单引号时,用两个连续的单引号表示一个单引号,双引号亦然。单引号引起来的字符串中出现双引号时不需要处理。例如如下的示例:
示例:字符串 ab'cd"ef 字面量的正确书写如下: 'ab''cd"ef'或 "ab'cd""ef" |
- 二进制
二进制数据的书写是将一个字节分为两个十六进制数表示(0~F不区分大小写),并使用0x' 和 ' 包含起来。
示例: 0x283C 值的书写如下: 0x'283C' |
- 时间类型
PinusDB没有时间类型,需要存储时间请使用bigint类型,并将时间值设置为自1970-1-1 0:0:0 以来的毫秒数。
5. 比较运算符
PinusDB支持下面的比较运算符:
运算符 |
操作数 |
描述 |
= |
二元 |
等于,可以作用于除blob外的其他类型。 |
<> |
二元 |
不等于,可以作用于除blob外的其他类型。 |
> |
二元 |
大于,可以作用于除string,blob外的其他类型。 |
>= |
二元 |
大于或等于,可以作用于除string,blob外的其他类型。 |
< |
二元 |
小于,可以作用于除string,blob外的其他类型。 |
<= |
二元 |
小于或等于,可以作用于除string,blob外的其他类型。 |
like |
二元 |
仅可作用于string字符串,可以使用通配符。 % 匹配一个或多个任意字符 _ 匹配一个任意字符 |
6. 逻辑运算符
PinusDB仅支持 AND 逻辑运算符。
7. 聚合函数聚合函数对一组值执行计算并返回一个值。PinusDB的Group By 子句中只能引用对象名列(objectname)或时间戳列(timestamp)。注意:聚合函数必须使用AS来指定列的别名。
测试数据
空气监测表(airmonitor)数据如下:
objectname |
timestamp |
pm2_5 |
pm10 |
湖南.长沙.经开区环保局 |
1514736000000 |
32 |
32 |
湖南.长沙.经开区环保局 |
1514764800000 |
33 |
34 |
湖南.长沙.经开区环保局 |
1514793600000 |
33 |
33 |
湖南.长沙.雨花区环保局 |
1514736000000 |
28 |
5 |
湖南.长沙.雨花区环保局 |
1514764800000 |
29 |
5 |
湖南.长沙.雨花区环保局 |
1514793600000 |
30 |
7 |
湖南.岳阳.南湖风景区 |
1514736000000 |
45 |
40 |
湖南.岳阳.南湖风景区 |
1514764800000 |
52 |
57 |
湖南.岳阳.南湖风景区 |
1514793600000 |
53 |
58 |
AVG
声明:AVG(fieldname)
说明:返回指定字段的平均值,不支持string,blob字段,返回值类型与字段类型一致。
示例:
查询airmonitor表中,岳阳市南湖风景区在2018年1月1日的平均pm2.5浓度 SELECT AVG(pm2_5) AS avg_pm2_5 FROM airmonitor WHERE objectname = '湖南.岳阳.南湖风景区' AND timestamp >=1514736000000 AND timestamp < 1514822400000; 注:1514736000000为2018-1-1 0:0:0 距离1970-1-1 0:0:0的毫秒数 1514822400000为2018-1-2 0:0:0 距离1970-1-1 0:0:0的毫秒数 执行结果为: 52 |
COUNT
声明:COUNT(fieldname)
说明:返回检索到的行数量,支持所有类型字段,返回值为bigint类型。
示例:
查询airmonitor中,pm2.5超过30的数量 SELECT COUNT(pm2_5) AS cnt FROM airmonitor WHERE pm2_5 > 30;
执行结果为: 6 |
MAX
声明:MAX(fieldname)
说明:返回指定字段最大的值,不支持string,blob字段,返回值类型与字段类型一致。
示例:
查询airmonitor中,pm10最大的值 SELECT MAX(pm10) AS max_pm10 FROM airmonitor; 执行结果: 58 |
MIN
声明:MIN(fieldname)
说明:返回指定字段最小的值,不支持string,blob字段,返回值类型与字段类型一致。
示例:
查询airmonitor中,pm10最小的值 SELECT MIN(pm10) AS min_pm10 FROM airmonitor; 执行结果: 5 |
SUM
声明:SUM(fieldname)
说明:返回指定字段的和,不支持string,blob字段。
当字段类型是tinyint,smallint,int 或 bigint时,返回值类型为bigint;
当字段类型是float 或 double 时,返回值类型为 double;
示例:
查询airmonitor中,pm10的和 SELECT SUM(pm10) AS sum_pm10 FROM airmonitor; 执行结果: 289 |
LAST
声明:LAST(fieldname)
说明:返回时间戳最大的值,支持所有字段。
示例:
查询airmonitor中,各个气象站最新的数据 SELECT objectname, LAST(timestamp) AS last_tm, LAST(pm2_5) AS last_pm2_5, LAST(pm10) AS last_pm10 FROM airmonitor GROUP BY objectname; 执行结果:
|
未完待续......