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非常类似:
查看所有数据库
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
没有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
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操作语句后面不需要加分号。
=========================================================================
向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 * 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
后面字符串用单引号,条件符支持=、!=、<>、>、>=、<、<=、正则
等。
=====================================================================================
可以看到select
查出的数据time是一长串时间戳,可以输入precision rfc3339
,然后执行select
查询,即可显示格式化好的time
:
不过看到显示的time
,比当前时间少了8小时,可以在select
语句后面指定时区tz('Asia/Shanghai')
:
============================================================================
默认情况,select
查询出来的记录是以column
列的形式展示,可以执行format json
,以json
格式展示,不过这样显示的数据排版不是很好看:
可以执行pretty
,让json
格式的排版更好看:
完整json:
{
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
[外链图片转存中…(img-aS0GCoaw-1715696004933)]
[外链图片转存中…(img-3J4iBRL6-1715696004933)]
[外链图片转存中…(img-P8kND91L-1715696004934)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!