初次使用时序数据库InfluxDB,有些概念还是需要了解清楚的,InfluxDB与传统的关系型数据库MySql在使用上有哪些区别呢?
MySql | InfluxDB | 说明 |
---|---|---|
database | database | 数据库 |
table | measurement | 类似于Mysql中表的概念 |
field | tag + field + timestamp | 传统表中的一行数据,在influxdb中,可以划分为三个 |
数据库 database
数据库,在概念上和关系型数据库MySQL没有什么区别,操作命令也是一样的;只不过,这里的操作命令是influx query language,简称InfluxQL语言;
show databases; //展示所有的数据库;
create database <dbName>; //创建数据库;
drop database <dbName>; //删除数据库;
use <dbName>; //使用某个数据库
度量 measurement
在influxdb中,没有表这个说法,只有度量measurement,它的作用相当于表;在使用时也与传统意思上的表大有区别;在MySQL中,需要先创建表,然后才可对表中的数据进行增删改查,一个表中的字段个数也是固定的;在influxdb中,则无需先创建度量measurement,在新增数据时,如果不存在则创建。
show measurements; //显示所有的度量measurement
insert sensorMonitorData,deviceId=001 temperature=15 //新增一个度量,只有一个tag和一个field;
insert sensorMonitorData1,deviceId=001,companyId=001 temperature=15,voltage=12 //新增两个度量,包含两个tags和两个fields;
show tag keys from <tbname> //展示度量中所有的tag;
show field keys from <tbname> //展示度量中所有的field;
select * from <tbname> //展示度量中的数据;
precision rfc3339 //对度量中的时间戳进行格式化处理;
delete from <measurement> //删除度量中所有的数据
drop measurement <measurement> //删除度量
新增语法结构分析:
insert into <retention policy> measurement,tagKey=tagValue fieldKey=fieldValue timestamp;
特别说明:
retention policy,保留策略,非必填;
timestamp,时间戳,非必填;不填写时,自动生成;如果要加,在filed后添加空格,再添加时间戳;
tag与tag之间用逗号分隔,由于tag都是string类型,因此不需要加引号;
tag与field之间用空格分隔,field与field之间用逗号分隔;
field有四种类型:int、 float、string、 boolean,每种类型在使用时不一样,所以如果是string类型,需要加引号,否则会报错;
field类型 | 方式 | 示例 |
---|---|---|
float | 数字 |
user_id=21 |
int | 数字i |
age=18i |
boolean | true/false |
is_boy=true |
String |
"" or ''
|
email="123456@qq.com" |
这里是需要注意的地方,也是新手容易犯错的地方,在使用field时,特别是String类型的field,一定要把field的value用双引号包裹起来,不然新增的时候会报错;不能像使用tag一样使用field。
查询特别说明:
创建的度量名称里,如果有点号时,输入双引号包裹起来,否则会报错。
删除特别说明:
在执行delete from <measurement>语句时,measurement中的数据没有了,measurement也就不存在了,压根就不需要再执行一遍drop measurement <measurement>语句,因此它俩是等价的,但是不知道这个和influxdb的版本有没有关系,这里使用的版本是1.8。
**保留策略 retention policy **
在influxdb里,是没有修改操作的,对数据可以设置保留时长,保存几个备份,以及在数据集群中的处理,这就是保留策略retention policy;
show retention policies on <dbName> //展示数据库所采用的保留策略;
查询策略说明:
name: 名称;
duration: 保留时间, 0表示永久保存;
shardGroupDuration: shardGroup的存储时间,shardGroup是InfluxDB的一个基本储存结构,大于这个时间的数据,在查询效率上应该有所降低;
replicaN: 全称是replication,副本个数;
default: 是否是默认策略;
create retention policy <retentionName> on <dbName> duration <durationTime> replication <replicaN> default; //新建策略
新增策略说明:
retentionName:策略名称,用双引号包裹起来;
dbName:数据库名称;
durationTime: 保留时间, 0表示永久保存,2h代表两个小时,2d代表2天;
replicaN:全称是REPLICATION,副本个数
default: 是否是默认策略;
保留策略单位一览表:
Units | Meaning |
---|---|
ns | nanoseconds (1 billionth of a second) |
u or µ | microseconds (1 millionth of a second) |
ms | milliseconds (1 thousandth of a second) |
s | second |
m | minute |
h | hour |
d | day |
w | week |
alter retention policy <retentionName> on <dbName> duration <durationTime> default;//修改策略
alter retention policy "autogen" on test duration 0s default; //恢复默认策略
retentionName:策略名称,用双引号包裹起来;
dbName:数据库名称;
durationTime: 保留时间, 0表示永久保存,2h代表两个小时,2d代表2天;
default: 是否是默认策略;
drop retention policy <retentionName> on <dbName>; //删除策略
retentionName:策略名称,用双引号包裹起来;
dbName:数据库名称;
特别注意:在删除默认策略前,一定要重新指定一个默认策略,否则新增度量时会报错。
接下来新建一条带有保留策略的数据,先建立一个保留策略,再建立保留策略的数据,看看是不是到了时间就被删除了。
在创建带保留测试数据遇到的问题:
- 本来是想建立一条几秒钟就过期的数据,但是报错了,ERR: retention policy duration must be at least 1h0m0s,这条报错提示,过期时间至少一个小时,额,好吧,重新建立一个为时一个小时的保留策略。
- 在创建带有策略的数据时,使用insert语句直接报错了,把insert改成insert into正常运行,这说明,在使用默认策略时,语句中不带策略时,使用insert语句,加了策略就必须使用insert into语句;这是需要注意的地方。
还有没有其他命令可以使用,在命令行CMD里,输入help,可以查看更多的命令:
把展示的内容改变为json形式,1个小时前的数据已经被删除了,现在所看到的是一个空的json格式;在新加一条数据,看看查询的结果;
format json;
select * from person;
InfluxQL语言有以下这些关键字,在创建measurement、tag、field的时候,要避开保留的关键字,否则会报错:
all | alter | any | as | asc |
---|---|---|---|---|
begin | by | create | continuous | database |
databases | default | delete | desc | destinations |
diagnostics | distinct | drop | duration | end |
every | explain | field | for | from |
grant | grants | group | groups | in |
inf | insert | into | key | keys |
kill | limit | show | measurement | measurements |
name | offset | on | order | password |
policy | policies | privileges | queries | query |
read | replication | resample | retention | revoke |
select | series | set | shard | shards |
slimit | soffset | stats | subscription | subscriptions |
tag | to | user | users | values |
where | with | write |
复杂的查询语句
select <field_key>[,<field_key>,<tag_key>] from <tbname> [ into_clause ] [ where_clause ]
[ group_by_clause ] [ order_by_clause ] [ limit_clause ]
[ offset_clause ] [ slimit_clause ] [ soffset_clause ]
查询遇到的问题:
- 在执行select height,weight from person where id="0001"语句时,没有返回结果,在执行select height,weight from person where name="ff",直接报错:ERR: error parsing query: found NAME, expected identifier, string, number, bool at line 1, char 40;检查了以下语句,还是和关键词有关系,这个measurement的取名为name的tag,使用了关键字呀!
- 在新增语句里,tag的value一定不要加双引号,这个一定得注意,否则条件查询查不出来!!!
- 在查询语句的where条件里,tag的value值一定要加单引号,tag的key要加双引号,否则查不出来,也不报错,这个一定得注意!!!
在where条件里,既可以匹配tag,也可以匹配field,但是它们可以使用的操作符却是不一样的,tag的数据类型是String类型,field则支持四种数据类型;
tag支持的操作符:
操作符 | 含义 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
field支持的操作符:
操作符 | 含义 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
更多精彩,还在官方文档:
https://docs.influxdata.com/influxdb/v1.8/query_language/