influxdb 时序数据库常用命令

发布时间:2022-07-03 18:10:49 作者:yexindonglai@163.com 阅读(2871)

前言

时序数据库一般来说最常见的操作就只有2种,要么写,要么查

influx部分语法说明

特别注意:influxDB 2.0版本相对1.x版本改动较大,尤其是语法方面的改动,2.0版本的语法使用的是JavaScript,1.x使用的是sql。 这里使用的1.x的版本

进入influxdb

要操作 influxdb,首先要进行登录后才能操作,一般情况下,influxdb都是安装在linux系统中的,所以在控制台输入以下命令即可进入influxdb

  1. # 直接登录
  2. influx
  3. # 通过账号密码登录
  4. influx -username root -password 123456

用户相关

  1. //查看用户,两列数据,一列是用户名称,一列是是否为管理员用户
  2. show users
  3. //创建普通户
  4. create user "influx" with password '123456'
  5. //创建管理员用户
  6. create user "root" with password '123456' with all privileges
  7. //修改用户密码
  8. set password for root= 'root'
  9. //通过cli操作influxdb
  10. influx -username root -password root

权限相关

  1. /**
  2. * 数据库设置admin权限的两种方式(建议使用第二种)
  3. */
  4. GRANT ALL PRIVILEGES ON 数据库名称 TO 用户名称
  5. GRANT ALL PRIVILEGES TO 用户名称
  6. /**
  7. * 数据库撤销admin权限的两种方式(建议使用第二种)
  8. */
  9. Revoke ALL PRIVILEGES ON 数据库名称 FROM 用户名称
  10. Revoke ALL PRIVILEGES FROM 用户名称

数据库相关

1、创建数据库
  1. create database db_name
2、查看所有数据库
  1. show databases
3、删除库
  1. drop database db_name
4、使用某个数据库
  1. use db_name

表相关

influxdb中没有table(表)的概念,取而代之的是 measurements,功能与关系型数据库的中的表一致,也可以将measurements称为 influxdb中的表;

1、查看所有的表
  1. show measurements
2、创建表

influxdb中没有建表语句,只能通过insert数据的方式来建立新表,也就是说在插入数据的时候会自动建表

3、插入数据
  1. insert user,hostname=id value=12345678
  • user: 表名
  • hostname:索引字段名(tag)
  • value:字段名,=后面是字段的值

注意:因为是时序数据库,当插入数据后,系统会自动追加时间戳,但也可以在添加数据时自己写入时间戳

  1. insert user ,hostname=id value=12345678 1435362189575692182

指定多个tag

其中 table_1就是表名,host,hostname索引(tag),value=xx是记录值(field),记录值可以有多个,后面的时间戳是我们指定的,如果不指定系统自动加当前时间时间戳。

  1. insert table_1,host=470b14f0-e869-43ed-a8e6-fd634258271f,hostname=server01 value=0.9 1651668886000000000

注意事项

当我们只有一个field时,他的值必须是数值、浮点型、boolean这三种中的其中一种,不能使用其他类型

  1. # 以下三个命令都是可以正常执行的
  2. insert table_4,hostname=server value=0
  3. insert table_4,hostname=server value=false
  4. insert table_4,hostname=server value=0.9
  5. # 以下命令会报错,因为value是字符串类型
  6. insert table_4,hostname=server value=abc
  7. insert table_4,hostname=server value=woaini
  8. insert table_4,hostname=server value=989p

而且一旦指定了类型,不能改变

  1. # 先插入一条数据,value为数值
  2. insert table_4,hostname=server value=0
  3. # 在插入第二条数据,value为boolean类型, 会报错
  4. insert table_4,hostname=server value=false

插入字符串类型的字段

  1. # 其中,value字段为int类型, name字段为string类型
  2. insert table_5,hostname=server value=0,name="woaini"
  3. 其中,value字段为int类型, name字段为string类型,agestring类型,xxint类型
  4. insert table_5,hostname=server value=0,name="w1oaini",age="woxiangni",xx=1

插入具有多个tag和多个field的数据

  • 多个tag之间用逗号分割,不能有多余的字符或空格
  • 多个field之间用逗号分割,不能有多余的字符或空格
  • tag和field之间用空格分割,不能有多余的字符或空格
  1. insert device_report_dp_log,device_id=G19Hkne5yQ0leOgw,dp_name=Alarm,message_id=123,rocket_message_id=123,ts=123,uuid=123 dp_event="456",dp_event_number=123,event_type=123,source=1,topic_type="1",type="1"

说明

  • device_report_dp_log 是表名
  • device_id 、dp_name、message_id、rocket_message_id、ts、uuid 是tag
  • dp_event、dp_event_number、event_type、source、topic_type、type是field
  • tag的数据类型都是string,不需要双引号,field的数据类型如果是string,需要加上双引号
4、删除表
  1. # 如果不行就加上双引号
  2. drop measurement table_name
  3. drop measurement "table_name"
5、查询表
  1. select * from table_name
6、tag(索引)
  1. //查看表的tag
  2. show tag keys from 表名称
7、field (字段)
  1. //查看表的field
  2. show field keys from 表名称
8、series
  1. //查看表的series
  2. show series from "表名称"
  3. //查看当前库的series
  4. show series
9、删除数据

influxdb没有提供删除功能,但是可以配置 数据保留策略

数据保留策略

influxDB是没有提供直接删除数据记录的方法,但是提供数据保存策略,但是提供数据保存策略,主要用于指定数据保留时间,超过指定时间,就删除这部分数据。(数据库过期策略至少一个小时),默认保存策略为7天(168小时)

查看数据保存策略
  1. # 查看某个库的策略
  2. show retention policies on "数据库名称"
  3. # 查看当前库下的策略,需要先用 use database 命令指定库名
  4. show retention policies

查询结果如下

  1. > SHOW RETENTION POLICIES ON telegraf
  2. name duration shardGroupDuration replicaN default
  3. default 0 168h0m0s 1 true
  • name: 策略名称
  • duration:数据保存时间,超过这个时间自动删除,0表示永久保存
  • shardGroupDuration:shardGroup的存储时间,shardGroup是InfluxDB的一个基本储存结构,在这个时间内插入的数据查询较快,数据存放大于168小时查询速度降低;
  • replicaN:全称是REPLICATION,副本个数
  • default:是否默认策略
创建数据保留策略
  1. # h(小时),d(天),w(星期)
  2. //CREATE RETENTION POLICY "保留策略名称" ON "数据库名称" DURATION "该保留策略对应的数据过期时间" REPLICATION "复制因子,开源的InfluxDB单机环境永远为1" SHARD DURATION "分片组的默认时长" DEFAULT
  3. create retention policy "testPolice" on myInfluxdb duration 72h replication 1 SHARD DURATION 1h default
  4. //修改保留策略
  5. alter retention policy "保留策略名称" on "数据库名称" duration 1d
  6. //删除保留策略
  7. drop retention policy "保留策略名称" on "数据库名称"

复杂查询

前言

表名 :device_escalation_log

表结构

字段名 说明 是否索引 数据类型
device_id 设备id String
message_id 设备消息id String
rocket_message_id mq消息id String
ts 时间 long
uuid 设备uuid String
msg 消息内容 String
sources 来源 int

一、普通查询

1、查询所有的 tag 和 field

  1. SELECT * FROM device_escalation_log where uuid='123'

2、从单个measurement查询所有的field,不查tag

  1. SELECT *::field FROM device_escalation_log

3、从单个measurement查询特定的field和tag.,注意:查询时至少要带上一个field key,如果只查询tag字段的话是查不到数据的

  1. SELECT uuid,source FROM device_escalation_log

4、同时查询多张表

  1. select * from device ,device_escalation_log

5、模糊查询

  1. # 前缀匹配 ,相当于 mysql 的 like 'abc%'
  2. select * from device_escalation_log where uuid=~/^abc/
  3. # 后缀匹配 ,相当于 mysql 的 like '%abc'
  4. select * from device_escalation_log where uuid=~/abc$/
  5. # 前后匹配,相当于 mysql 的 like '%abc%'
  6. select * from device_escalation_log where uuid=~/abc/

二、聚合函数

注意事项:

聚合函数只能对field字段进行操作,不能对tag字段操作,否则查询出来的列表是空的

如果我就要对tag字段进行聚合函数计算怎么办? 那我们可以通过子查询来实现:

  1. select distinct(uuid) from (
  2. select * from device_escalation_log
  3. )

1、count() 统计

  1. # 查询某个field字段的中的非空值数量
  2. select count("msg") from device_escalation_log

2、DISTINCT() 去重

  1. select DISTINCT("msg") from device_escalation_log

3、MEAN() 求平均值,这个平均值必须是数字类型

  1. select MEAN("source") from device_escalation_log

4、MEDIAN() 求中位数,从单个字段(field)中的排序值返回中间值

  1. select MEDIAN("source") from device_escalation_log

5、SPREAD() 返回字段的最小值和最大值之间的差值。数据的类型必须是长整型或float64

  1. select SPREAD("source") from device_escalation_log

6、SUM() 求和

  1. select SUM("source") from device_escalation_log

7、BOTTOM() 返回一个字段中最小的N个值。字段类型必须是长整型或float64类型。

  1. select BOTTOM("source",6) from device_escalation_log

8、FIRST() 返回一个字段中最老的取值。(第一个插入的数据),相当于select * from table order by asc limit 1

  1. select FIRST("source") from device_escalation_log

9、LAST() 返回一个字段中最新的取值。(最后一个插入的数据),相当于select * from table order by desclimit 1

  1. select LAST("source") from device_escalation_log

10、MAX() 求最大值

  1. select MAX("source") from device_escalation_log

11、PERCENTILE() 返回排序值排位为N的百分值。字段的类型必须是长整型或float64。

  1. select PERCENTILE("source",3) from device_escalation_log

12、STDDEV() 返回一个字段中的值的标准偏差。值的类型必须是长整型或float64类型。

  1. select STDDEV("source") from device_escalation_log

三、分组聚合

tag分组

  1. # 根据uuid 进行分组
  2. select * from device_escalation_log group by uuid
  3. # 根据uuid 进行分组,若uuid为空,使用`5`进行填充
  4. select source,uuid from device_escalation_log group by uuid fill(5)

先分组在聚合

  1. # 分组聚合后只能查询聚合函数,不能查询字段 ,比如这个查询会报错: select count(source),uuid from device_escalation_log group by uuid fill(5)
  2. select count(source) from device_escalation_log group by uuid fill(5)
  3. select count(source) ,sum(source) from device_escalation_log group by uuid fill(5)

基于时间分组

  1. # 查询所有数据,并对其划分为每200毫秒一组
  2. select count(source) from device_escalation_log group by time(200ms)
  3. # 查询所有数据,并对其划分为每200秒一组
  4. select count(source) from device_escalation_log group by time(200s)
  5. # 查询所有数据,并对其划分为每12分钟一组
  6. select count(source) from device_escalation_log group by time(12m)
  7. # 查询所有数据,并对其划分为每12小时一组
  8. select count(source) from device_escalation_log group by time(12h)
  9. # 查询所有数据,并对其划分为每12天一组
  10. select count(source) from device_escalation_log group by time(12d)
  11. # 查询所有数据,并对其划分为每12周一组
  12. select count(source) from device_escalation_log group by time(12w)

四、分页查询

LIMIT 用法有2种

  • limit 10:查询前10条数据
  • limit size offset N: size表示每页 大小,N表示第几条记录开始查询
  1. # 查询前10条数据
  2. select * from device_escalation_log limit 10
  3. # 分页,pageSize 为每页显示大小, pageIndex 为查询的页数
  4. pageIndex = 1
  5. pageSize = 10
  6. SELECT * FROM device_escalation_log LIMIT pageSize OFFSET (pageIndex-1)*pageSize

五、排序

  1. # 升序
  2. select * from device_escalation_log order by time asc
  3. # 降序
  4. select * from device_escalation_log order by time desc

六、实现 in() 查询

关系型数据库可以用in关键字来查询多个值,就像这样

  1. select * from user where user_name in ('张三''李四''王五');

但是时序数据库是没有 in 查询的,虽然in是保留的关键字,但是依然有办法解决, 还记得刚刚的模糊查询吗?没错,就是用它来解决这个问题

  1. # 同时匹配 123 和 thing ,因为前后都机上了 ^ 和 $ ,所以这已经不是模糊查询,而是完全匹配才会查询出来
  2. select * from device_escalation_log where uuid =~/^123$|^thing$/

六、查看执行计划

和mysql一样,在前面加上 explain 关键字即可,查询结果尚在研究中

  1. explain select distinct("source") from device_escalation_log

七、指定时区

当我们插入influxdb时默认插入的time字段是0时区的,需要转成指定的时区可以在后面加上 ts('时区字符串')

  1. SELECT * FROM "device_issue_log_111" WHERE time > now() - 5m tz('Asia/Shanghai')

以下是各个国家的时区列表

  1. 0 = "Africa/Abidjan"
  2. 1 = "Africa/Accra"
  3. 2 = "Africa/Addis_Ababa"
  4. 3 = "Africa/Algiers"
  5. 4 = "Africa/Asmara"
  6. 5 = "Africa/Asmera"
  7. 6 = "Africa/Bamako"
  8. 7 = "Africa/Bangui"
  9. 8 = "Africa/Banjul"
  10. 9 = "Africa/Bissau"
  11. 10 = "Africa/Blantyre"
  12. 11 = "Africa/Brazzaville"
  13. 12 = "Africa/Bujumbura"
  14. 13 = "Africa/Cairo"
  15. 14 = "Africa/Casablanca"
  16. 15 = "Africa/Ceuta"
  17. 16 = "Africa/Conakry"
  18. 17 = "Africa/Dakar"
  19. 18 = "Africa/Dar_es_Salaam"
  20. 19 = "Africa/Djibouti"
  21. 20 = "Africa/Douala"
  22. 21 = "Africa/El_Aaiun"
  23. 22 = "Africa/Freetown"
  24. 23 = "Africa/Gaborone"
  25. 24 = "Africa/Harare"
  26. 25 = "Africa/Johannesburg"
  27. 26 = "Africa/Juba"
  28. 27 = "Africa/Kampala"
  29. 28 = "Africa/Khartoum"
  30. 29 = "Africa/Kigali"
  31. 30 = "Africa/Kinshasa"
  32. 31 = "Africa/Lagos"
  33. 32 = "Africa/Libreville"
  34. 33 = "Africa/Lome"
  35. 34 = "Africa/Luanda"
  36. 35 = "Africa/Lubumbashi"
  37. 36 = "Africa/Lusaka"
  38. 37 = "Africa/Malabo"
  39. 38 = "Africa/Maputo"
  40. 39 = "Africa/Maseru"
  41. 40 = "Africa/Mbabane"
  42. 41 = "Africa/Mogadishu"
  43. 42 = "Africa/Monrovia"
  44. 43 = "Africa/Nairobi"
  45. 44 = "Africa/Ndjamena"
  46. 45 = "Africa/Niamey"
  47. 46 = "Africa/Nouakchott"
  48. 47 = "Africa/Ouagadougou"
  49. 48 = "Africa/Porto-Novo"
  50. 49 = "Africa/Sao_Tome"
  51. 50 = "Africa/Timbuktu"
  52. 51 = "Africa/Tripoli"
  53. 52 = "Africa/Tunis"
  54. 53 = "Africa/Windhoek"
  55. 54 = "America/Adak"
  56. 55 = "America/Anchorage"
  57. 56 = "America/Anguilla"
  58. 57 = "America/Antigua"
  59. 58 = "America/Araguaina"
  60. 59 = "America/Argentina/Buenos_Aires"
  61. 60 = "America/Argentina/Catamarca"
  62. 61 = "America/Argentina/ComodRivadavia"
  63. 62 = "America/Argentina/Cordoba"
  64. 63 = "America/Argentina/Jujuy"
  65. 64 = "America/Argentina/La_Rioja"
  66. 65 = "America/Argentina/Mendoza"
  67. 66 = "America/Argentina/Rio_Gallegos"
  68. 67 = "America/Argentina/Salta"
  69. 68 = "America/Argentina/San_Juan"
  70. 69 = "America/Argentina/San_Luis"
  71. 70 = "America/Argentina/Tucuman"
  72. 71 = "America/Argentina/Ushuaia"
  73. 72 = "America/Aruba"
  74. 73 = "America/Asuncion"
  75. 74 = "America/Atikokan"
  76. 75 = "America/Atka"
  77. 76 = "America/Bahia"
  78. 77 = "America/Bahia_Banderas"
  79. 78 = "America/Barbados"
  80. 79 = "America/Belem"
  81. 80 = "America/Belize"
  82. 81 = "America/Blanc-Sablon"
  83. 82 = "America/Boa_Vista"
  84. 83 = "America/Bogota"
  85. 84 = "America/Boise"
  86. 85 = "America/Buenos_Aires"
  87. 86 = "America/Cambridge_Bay"
  88. 87 = "America/Campo_Grande"
  89. 88 = "America/Cancun"
  90. 89 = "America/Caracas"
  91. 90 = "America/Catamarca"
  92. 91 = "America/Cayenne"
  93. 92 = "America/Cayman"
  94. 93 = "America/Chicago"
  95. 94 = "America/Chihuahua"
  96. 95 = "America/Coral_Harbour"
  97. 96 = "America/Cordoba"
  98. 97 = "America/Costa_Rica"
  99. 98 = "America/Creston"
  100. 99 = "America/Cuiaba"

关键字数据库