InfluxDB基础教程:核心概念与基本操作详解
InfluxDB基础教程:核心概念与基本操作详解
InfluxDB基础概念
InfluxDB是一种开源的时序数据库,主要用于存储和查询时间序列数据。在InfluxDB中,数据以特定的结构存储,主要包括以下几个核心概念:
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语句中如果需要写入整型数据,需要在数值后面加个i。
- string:字符串类型,insert语句中如果需要写入字符串,需要使用英文双引号包含数值。
- boolean:布尔型,真可以用 t, T, true, True, TRUE 表示;假可以用 f, F, false, False 或者 FALSE 表示。
基本语法
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
measurement的特殊性
measurement在使用时需要注意以下几点:
- measurement无需单独创建,在第一次插入数据时自动创建。
- measurement中无数据时,表也就不存在了。
- measurement没有update语句,无法修改measurement以及tags-key和fields-key名称,实际中如有需要只能删除整个measurement重新插入数据。不过也可以通过
select * into newxxx from oldxxx
,从旧表中查出数据导入到新表。可以在语句后面加上group by
,这样就可以把tag复制过去了。
InfluxDB独有语法
- show series:查询tag_key和tag_valalue
- show tag keys:查看tags名称
- show field keys:查看fields名称,不仅会显示fields名称结果集,还显示field的数据类型
注意: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:
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"
]
]
}
]
}
]
}