文章目录
influxdb 时序数据库知识点个人记录合集
官网传送门:https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration/
InfluxDB Studio:https://github.com/CymaticLabs/InfluxDBStudio
中文文档:https://jasper-zhang1.gitbooks.io/influxdb/content/
1、influxdb支持的运算符
Meaning | Operator |
---|---|
等于 | = |
不等于 | != 、<> |
大于 | > |
大于等于 | >= |
小于 | < |
小于等于 | <= |
2、group by 分组
与mysql的分组规则基本一致,值得注意的点是:
(1)influxdb中使用 time(),如 group by time(1d)
为以1天为分组
(2)使用 group by
时分组的字段会连同查询的字段一起输出,而查询的字段只能是聚合函数
如下:
select count(CJSJ) AS total,count(LJNSXH) as ljnsxhtotal FROM tableName GROUP BY time(1d), SBXLH fill(0)
输出:total,ljnsxhtotal,SBXLH,time
3、聚合函数
(1)influxdb中使用聚合函数与mysql存在差异,influxdb中的聚合函数只能使用基础的功能,如count(1)
不可使用,可使用count(字段)
返回字段有数据的总条数,不能使用count(time)
(2)聚合函数内加条件
如:count(字段=0 or NULL)
,sum(字段+字段)
,sum(CASE when online = 1 then 1 else 0 end)
等,这些在influxdb中都不具备这种功能,需要加条件只能在where添加筛选
官网:https://docs.influxdata.com/influxdb/v1.7/flux/guides/group-data/
4、空数据处理 fill(),相当于mysql的IFNULL的作用,但不能指定字段
给空数据赋予某个值,如下,给是空值的赋予0(可以赋予其它值,如-1、2),只能位于sql所有条件之后
select * from tableName fill(0)
官网:https://docs.influxdata.com/influxdb/v1.7/flux/guides/fill/
5、返回第一条/最新一条非空数据
FIRST()/LAST()
返回按时间排序的第一条/最新一条非空数据
(1)返回第一条数据 first(time)
(2)返回最新一条数据,last(time)
如下,返回采集时间最新的一条数据:
SELECT LAST("CJSJ") AS "CJSJ",SBXLH FROM "processdata" group by "SBXLH"
// or
SELECT LAST("CJSJ") AS "CJSJ",COUNT(CJSJ) AS total FROM "processdata"
6、排序 order by time desc
时序数据库中的排序只能用于time 进行排序
7、时间查询
意义 | 符号 |
---|---|
微秒 | u or µ |
毫秒 | ms |
秒 | s |
分 | m |
时 | h |
天 | d |
周 | w |
(1)查询过去七天的数据
select * from tableName where time > now()-7d
(2)查询过去5分钟的数据
select * from tableName where time > now()-5m
(3)查询昨天的数据
使用 new Date().getTime() 的前十位数,time的时间格式为2022-04-13T02:33:34.000000001z
select * from tableName where time >= 1649865600s and time <= 1649951999s
也可以使用的格式为
select * from tableName where time >= '2022-04-13T16:00:00Z' and time <= '2022-04-14T15:59:59Z'
查询昨天与查询过去一天的时间范围是不一样的,查询过去一天的数据当前时间往前24小时
8、终端操作influxdb数据库
已安装influxdb的前提下
(1)连接
influx
(2)用户登录
auth
输入账号密码
(3)查看数据库
show databases
(4)切换数据库
use mydb
(5)查看连续查询
show continuous queries
(6)查询
select * from tables
9、连续查询
influxdb 时序数据库新建/删除连续查询、数据插入-传送门:https://blog.csdn.net/weixin_44167504/article/details/124091880?spm=1001.2014.3001.5502
10、使用JWT令牌进行身份验证
1、时序数据库配置文件(.config/.conf)中添加自定义的共享密钥,密码字符串越长,则它越安全,默认为空,空时不进行jwt验证
[http]
shared-secret = "my super secret pass phrase"
2、使用 jsonwebtoken 生成令牌
const jwt = require('jsonwebtoken');
let secretKey = "my super secret pass phrase" // 公用秘钥
let token = jwt.sign({ udb: 'something' }, secretKey, { expiresIn: '1m' })
3、连接查询
const reuqest = require("request")
let host='127.0.0.1',
port='8086',
database='dbname',
query='show databases'
// 使用账号密码查询 http://${host}:${port}/query?db=${db.database}&u=${username}&p=${password}&precision=s
let url = `http://${host}:${port}/query?db=${database}&precision=s`;
return new Promise(res => {
request(
{
url: url,
method: 'POST',
headers: { // 使用账号密码查询时不需要配置
"Content-Type": "multipart/form-data;",
"Authorization": "Bearer " + token
},
formData: { q: query },
timeout: 30000 //30秒超时
},
function (error, response, body) {
// body -> string Object
// let data = JSON.parse(body)
// res(data);
}
);
});
正常返回格式:
4、遇到 "error":"token used befored issued"
,令牌校验时间早于签发时间,问题:时序数据库服务器的时间慢于请求的服务器的时间,解决:修改时间。
参考:
1、https://influxdb-v1-docs-cn.cnosdb.com/influxdb/v1.8/administration/authentication_and_authorization/
2、https://docs.influxdata.com/influxdb/v1.8/administration/authentication_and_authorization/#generate-your-jwt-token
11、模糊查询 之 like,not like
influxdb中没有like ,需要使用正则匹配查询,如:
name like '%我' => name = ~/^我/
name not like '%我' => name !~/^我/
1、模糊条件开头
select * from table where name = ~/^我/
2、模糊条件结尾
select * from table where name = ~/我$/
3、确切条件
select * from table where name = ~/我/