添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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



文章目录


前言

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)_时序库

​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)_时序库_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)_时序库_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)_influxdb_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)_fields_05

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

influxdb基础(二)——influxdb基本概念 (database、measurement、fields、tags) + 简单实操 (简单insert、select)_tags_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)_时序库_07

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

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

格式化显示查询数据

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

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

​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显示查询数据。

  • 参考:

    • 公司同事大佬整理的influxdb文档(感谢)

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



    python 中的dir和help的区别

    0.IDLE 的交互模式和编辑器模式有什么区别? 答:交互模式提供实时的编辑和功能实现;相比较之下编辑器模式需要编写完成后在交互模式中运行。1.在课堂上敲过的代码中,除了 print() 和 input(),你觉得还有哪一个是 Python 的 BIF 内置函数? 答:int()。事实上它是一个 工厂函数(Factory Function)2.请问 print() 和 Print() 的功能一样

    axios error 如何返回给前端页面

    二、Promise如果异步任务有两个结果,成功或失败,怎么办?1.两个结果怎么办?方法一:回调接受两个参数 约定:每一个回调第一个参数是失败的error,第二个参数是成功的结果fs.readFile('./1.txt',(error,data)=>{//读本地文件 if(error){ console.log('失败');return } console.log(data.toStr

    4.执行npm错误request to https://registry.npm.taobao.org/@babel%2fpreset-react failed, reason: certificate 5.w~深度学习~合集3