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

前言

influxdb作为数据库,它存储的数据结构是怎样的?与时间有什么关系?有什么特点?如何存取数据?

基本概念

学习一个新技术,上手使用是首要目标,类比学习或许是一个不错的学习方式。与熟悉的mysql等关系型数据库相比,influxdb也有数据库,数据表的概念。

mysqlinflux备注
databasedatabase数据库
tablemeasurement数据表
recordpoint一行数据记录

数据库也叫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数据类型注意:

类型备注
floatinfluxdb的fields默认是float浮点型
integer整型,insert语句如需写入field是整型,需在数值后面加个i
string字符串,insert语句如需写入field是字符串,需英文双引号包含数值
boolean布尔型,真可以用 t , T , true , True , TRUE表示;假可以用 f , F , false , False 或者 FALSE表示

一般情况下,经常作为查询条件的列,在初始时设置为tag,即索引,fields不常作为查询条件,更甚者,在复杂查询语法中,聚合语句group by 后面只能是timetags

基本语法

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

  1. show series 查询tag_keytag_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

在这里插入图片描述

  1. show tag keys 查看tags名称,后面可加wherelimit感觉意义不大,功能类似于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

在这里插入图片描述

  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操作语句后面不需要加分号。

简单实战演练

insert语法太多的坑

measurement名为frontendExpCount插入数据:

insert frontendExpCount,appid=1030,browserType=1,expType=8,netType=4g,isPc=true domain="www.aaa.cn",expCnt=10i

一条简单的insert语句,却隐藏多个坑:

  • tags之间用逗号分隔,fields之间用逗号分隔,tagsfields之间用空格分隔
  • 除了必要的空格,insert后面的空格和tagsfields分隔空格,不能再有其他空格,否则会出现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后面只能tagstime
  • tagsfields,一般情况tags并用于存储有价值的策略值,只是用于查询条件,没有fieldsmeasurements也就没有意义了。
  • 若一个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 后面只能是tagstime

  • 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内部指令,查看prettyformat的使用和意图。

pretty toggles pretty print for the json format

format specifies the format of the server responses: json, csv, or column

influx连接客户端指定多个参数

直接输入influx即可连接influxdb客户端,还可以在连接的时候指定hostportdatabase等,还可以直接携带内部命令execute。可输入influx -help 查看可以带哪些参数例如:

# execute 后面的命令需要用单引号
influx -username xxx -password 1234  -host 119.23.73.110  -port 8086  -database mytest -execute 'select * from forntExpCnt'

不过指定database和携带内部命令,需要同时指定usernamepassword

总结

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

参考:

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐同学呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值