文章目录
前言
influxdb作为数据库,它存储的数据结构是怎样的?与时间有什么关系?有什么特点?如何存取数据?
基本概念
学习一个新技术,上手使用是首要目标,类比学习或许是一个不错的学习方式。与熟悉的mysql等关系型数据库相比,influxdb也有数据库,数据表的概念。
mysql
|
influx
|
备注
|
database
|
database
|
数据库
|
table
|
measurement
|
数据表
|
record
|
point
|
一行数据记录
|
数据库也叫
database
,只是表名变了,
measurement
测量值的含义更能体现
influxdb
的特点,存储的数据是在时间的刻度上统计测量的结果,并不是一些冷冰冰的数值。正因为如此,数据记录的概念也有所不同,
influxdb
的一行记录称之为
point
,一个点。
point
由3部分组成
time+fields+tags
。
point的属性
|
备注
|
time
|
每行记录都有一列time,主索引,记录时间戳,单位纳秒,时区UTC(东八区减8小时)
|
fields
|
普通列,key-value结构,value数据类型支持型(float、integer、string、boolean)
|
tags
|
索引列,key-value结构,value数据类型只支持string
|
fields和tags key名称严格区分大小写。
fields数据类型注意:
类型
|
备注
|
float
|
influxdb的fields默认是float浮点型
|
integer
|
整型,insert语句如需写入field是整型,需在数值后面加个i
|
string
|
字符串,insert语句如需写入field是字符串,需英文双引号包含数值
|
boolean
|
布尔型,真可以用 t , T , true , True , TRUE表示;假可以用 f , F , false , False 或者 FALSE表示
|
一般情况下,经常作为查询条件的列,在初始时设置为tag,即索引,fields不常作为查询条件,更甚者,在复杂查询语法中,聚合语句
group by
后面只能是
time
和
tags
。
influxdb类比mysql语法
influxdb在一些语法方面也和mysql非常类似:
# 查看所有数据库
show databases
# 建库
create database dbname
# 删库
drop database daname
# 切换使用数据库
use dbname
# 查看所有表
show measurements
# 建表+插入数据,无需单独建表,插入数据的同时建表
insert xxx,tag1=1,tag2=www.aaa.com,tag3=2 field1=12i,field2="hhh",field=true
# 删表
drop measurement xxx
#简单查询
select * from xxx where tag1='1' and field2='hhh'
measurement的特殊性
measurement
是非常特殊的,平时使用时需要注意:
-
-
-
measurement
无需单独创建,在第一次插入数据时自动创建。
-
measurement
中无数据,表也就不存在了。
-
measurement
没有update语句,无法修改
measurement
以及
tags-key
和
fields-key
名称,实际中如有需要只能删除整个
measurement
重新插入数据。不过也可以通过
select * into newxxx from oldxxx
,从旧表中查出数据导入到新表。
-
select * into newxxx from oldxxx
,会将原表的tags当作fields复制到新表,可以在语句后面加上
group by
,这样就可以把tag复制过去了。
#指定所有的tags
select * into newxxx from oldxxx group by *
#指定某些tag
select * into newxxx from oldxxx group by xxx,xxx
influxdb独有语法
-
show series
查询
tag_key
和
tag_valalue
SHOW SERIES [ON database] [FROM measurement] [WHERE tag_key operator tag_value)] [limit offset]
示例:
show series on mytest from frontendExpCount where appid=‘1000’ limit 1
-
show tag keys
查看tags名称,后面可加
where
和
limit
感觉意义不大,功能类似于mysql的
desc table;
SHOW tag keys [ON database] [FROM measurement][WHERE tag_key operator tag_value)] [limit offset]
示例:
show tag keys on mytest from frontendExpCount
-
show field keys
查看fields名称,不仅会显示fields名称结果集,还显示field的数据类型
SHOW tag keys [ON database] [FROM measurement][WHERE tag_key operator tag_value)] [limit offset]
示例:
show field keys from frontendExpCount
注意:
influxdb操作语句后面不需要加分号。
简单实战演练
insert语法太多的坑
向
measurement
名为
frontendExpCount
插入数据:
insert frontendExpCount,appid=1030,browserType=1,expType=8,netType=4g,isPc=true domain="www.aaa.cn",expCnt=10i
一条简单的
insert
语句,却隐藏多个坑:
-
-
tags
之间用逗号分隔,
fields
之间用逗号分隔,
tags
和
fields
之间用空格分隔
。
-
除了必要的空格,
insert
后面的空格和
tags
和
fields
分隔空格,
不能再有其他空格
,否则会出现
missing tag value
的语法错误。
-
tags
都是字符串类型,但是不用双引号括起来;
fields
中有字符串类型需要用
英文双引号
括起来,如果不用英文双引号,会报语法错误
invalid boolean
,会认为是无效的布尔值,因为布尔类型无需加双引号。
-
tags
中设置布尔值就是字符串,
fields
中有布尔值,可用
t , T , true , True , TRUE,f , F , false , False
表示。
-
fields
中有整型
integer
,需要在数值后面加
i
,否则会出现
is type float, already exists as type integer dropped=1
。
-
经测试,插入数据时,不能没有
fields
:
insert service_count,serviceName=“UserSvr”,hostname=“dev5”,qps=12.0
ERR: {“error”:“unable to parse ‘service_count,serviceName=“UserSvr”,hostname=“dev5”,qps=12.0’: missing fields”}
经测试,插入数据时,只插入
fields
,可以没有
tags
,如何只插入fields呢?
insert measurement
后面空格接上
fields
insert service_count serviceName="UserSvr",hostname="dev5",qps=12.0
也可以理解,一个measurement里可以没有tags,但是不能没有fields。因为tags只是索引,并不是用于存储测量值的,而fields就是存储测量值的。
-
-
有fields无tags,只是没有
tags
索引,还有主索引
time
,如果只用到time查询条件,可以没有
tags
,但是实际情况中需要对数据聚合等复杂性查询,就必须要有tags。
fields
也可以作为查询条件,但是查询性能很低,至于聚合
group by
后面只能
tags
和
time
。
-
有
tags
无
fields
,一般情况
tags
并用于存储有价值的策略值,只是用于查询条件,没有
fields
,
measurements
也就没有意义了。
-
若一个
measurements
中只有
fields
,此时想把某个
field
改为
tags
,是无法修改的,只能删表重来,或者
select into
从旧表批量导入数据到旧表
select简单查询
插入多条数据后,可用
select
语句查询数据:
select * from frontendExpCount where appid='1009'
select
语法和mysql类似,支持
where
条件查询,
group by
聚合,
order by
排序,
limit
和一些聚合函数等。
需要注意:
-
-
select *
*可指定显示tag和field,如
select appid, expCnt from frontendExpCount
。
-
from
后面可以跟多个
measurements
,如
select * from xxx,xxx
。
-
group by
后面只能是
tags
和
time
。
-
order by
只能对
time
排序。
-
聚合之后不能使用
limit
。
-
where
后面字符串用单引号,条件符支持
=、!=、<>、>、>=、<、<=、正则
等。
time格式化显示precision
可以看到
select
查出的数据time是一长串时间戳,可以输入
precision rfc3339
,然后执行
select
查询,即可显示格式化好的
time
:
不过看到显示的
time
,比当前时间少了8小时,可以在
select
语句后面指定时区
tz('Asia/Shanghai')
:
格式化显示查询数据
默认情况,
select
查询出来的记录是以
column
列的形式展示,可以执行
format json
,以
json
格式展示,不过这样显示的数据排版不是很好看:
可以执行
pretty
,让
json
格式的排版更好看:
完整json:
{
"results": [
{
"series": [
{
"name": "frontendExpCount",
"columns": [
"time",
"appid",
"browserType",
"domain",
"expCnt",
"expType",
"isPc",
"netType"
],
"values": [
[
1603897585177504244,
"1030",
"1",
"www.ddd.com",
10,
"8",
"f",
"4g"
],
[
1603897579786521226,
"1030",
"1",
"www.ddd.com",
10,
"8",
"t",
"4g"
]
]
}
]
}
]
}
format
还支持以
csv
格式显示数据:
注:可
help
查看influx内部指令,查看
pretty
和
format
的使用和意图。
pretty toggles pretty print for the json format
format specifies the format of the server responses: json, csv, or column
influx连接客户端指定多个参数
直接输入
influx
即可连接
influxdb
客户端,还可以在连接的时候指定
host
、
port
、
database
等,还可以直接携带内部命令
execute
。可输入
influx -help
查看可以带哪些参数例如:
# execute 后面的命令需要用单引号
influx -username xxx -password 1234 -host 119.23.73.110 -port 8086 -database mytest -execute 'select * from forntExpCnt'
不过指定
database
和携带内部命令,需要同时指定
username
和
password
。
influxdb
作为时序库,与时间有很大的关系,
measurement
相当于一个时间轴,
point
就是时间轴上的一个点,类比mysql就是表中的一条记录。
经常作为查询条件的可设置为
tags
索引,数据类型只能是
string
。
普通数值,不用来作为查询条件或者很少用于查询条件设置为
fields
,数据类型支持
float
、
integer
、
string
、
boolean
。
measurement
中time时间戳是UTC时间,与东八区少8小时,可在select语句后面指定时区
tz('Asia/Shanghai')
select
语法
group by
后只能是
tags
和
time
,
order by
只能对
time
排序。
precision rfc3339
格式化时间显示。
format
+
pretty
完美json显示查询数据。
-
参考:
PS:
如若文章中有错误理解,欢迎批评指正,同时非常期待你的评论、点赞和收藏。我是徐同学,愿与你共同进步!