0
点赞
收藏
分享

微信扫一扫

influxdb基础(二)——influxdb基本概念 (database、measurement、fields、tags) + 简单实操 (简单insert、select)



文章目录


  • ​​前言​​
  • ​​基本概念​​
  • ​​基本语法​​

  • ​​influxdb类比mysql语法​​
  • ​​measurement的特殊性​​

  • ​​influxdb独有语法​​

  • ​​简单实战演练​​

  • ​​insert语法太多的坑​​
  • ​​select简单查询​​

  • ​​time格式化显示precision​​
  • ​​格式化显示查询数据​​
  • ​​influx连接客户端指定多个参数​​
  • ​​总结​​


前言

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​​是非常特殊的,平时使用时需要注意:


  1. ​measurement​​无需单独创建,在第一次插入数据时自动创建。
  2. ​measurement​​中无数据,表也就不存在了。
  3. ​measurement​​​没有update语句,无法修改​​measurement​​​以及​​tags-key​​​和​​fields-key​​​名称,实际中如有需要只能删除整个​​measurement​​​重新插入数据。不过也可以通过​​select * into newxxx from oldxxx​​,从旧表中查出数据导入到新表。

influxdb基础(二)——influxdb基本概念 (database、measurement、fields、tags) + 简单实操 (简单insert、select)_measurements

​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独有语法

  1. ​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

influxdb基础(二)——influxdb基本概念 (database、measurement、fields、tags) + 简单实操 (简单insert、select)_tags_02


  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

influxdb基础(二)——influxdb基本概念 (database、measurement、fields、tags) + 简单实操 (简单insert、select)_tags_03


  1. ​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基础(二)——influxdb基本概念 (database、measurement、fields、tags) + 简单实操 (简单insert、select)_fields_04


注意:​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'

influxdb基础(二)——influxdb基本概念 (database、measurement、fields、tags) + 简单实操 (简单insert、select)_measurements_05

​select​​语法和mysql类似,支持​​where​​条件查询,​​group by​​ 聚合,​​order by​​ 排序,​​limit​​和一些聚合函数等。

influxdb基础(二)——influxdb基本概念 (database、measurement、fields、tags) + 简单实操 (简单insert、select)_fields_06

需要注意:


  • ​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​​:

influxdb基础(二)——influxdb基本概念 (database、measurement、fields、tags) + 简单实操 (简单insert、select)_influxdb_07

不过看到显示的​​time​​,比当前时间少了8小时,可以在​​select​​语句后面指定时区​​tz('Asia/Shanghai')​​:

influxdb基础(二)——influxdb基本概念 (database、measurement、fields、tags) + 简单实操 (简单insert、select)_fields_08

格式化显示查询数据

默认情况,​​select​​查询出来的记录是以​​column​​列的形式展示,可以执行​​format json​​,以​​json​​格式展示,不过这样显示的数据排版不是很好看:

influxdb基础(二)——influxdb基本概念 (database、measurement、fields、tags) + 简单实操 (简单insert、select)_fields_09

可以执行​​pretty​​,让​​json​​格式的排版更好看:

influxdb基础(二)——influxdb基本概念 (database、measurement、fields、tags) + 简单实操 (简单insert、select)_tags_10

完整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​​格式显示数据:

influxdb基础(二)——influxdb基本概念 (database、measurement、fields、tags) + 简单实操 (简单insert、select)_时序库_11

注:可​​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​​。

总结


  1. ​influxdb​​​作为时序库,与时间有很大的关系,​​measurement​​​相当于一个时间轴,​​point​​就是时间轴上的一个点,类比mysql就是表中的一条记录。
  2. 经常作为查询条件的可设置为​​tags​​​索引,数据类型只能是​​string​​。
  3. 普通数值,不用来作为查询条件或者很少用于查询条件设置为​​fields​​​,数据类型支持​​float​​​、​​integer​​​、​​string​​​、​​boolean​​。
  4. ​measurement​​​中time时间戳是UTC时间,与东八区少8小时,可在select语句后面指定时区​​tz('Asia/Shanghai')​
  5. ​select​​​语法​​group by​​​ 后只能是​​tags​​​和​​time​​​,​​order by​​​ 只能对​​time​​排序。
  6. ​precision rfc3339​​格式化时间显示。
  7. ​format​​​ + ​​pretty​​完美json显示查询数据。

参考:


  • influxdb官方英文文档:​​https://docs.influxdata.com/influxdb/v1.8/query_language/spec/​​
  • influxdb中文文档:​​https://jasper-zhang1.gitbooks.io/influxdb/content/​​
  • ​​https://blog.hhui.top/hexblog/categories/DB/InfluxDB/​​​​
  • 公司同事大佬整理的influxdb文档(感谢)

PS: ​如若文章中有错误理解,欢迎批评指正,同时非常期待你的评论、点赞和收藏。我是徐同学,愿与你共同进步!



举报

相关推荐

0 条评论