190814-Influx Sql系列教程九:query数据查询基本篇二

文章目录
  1. 0. 数据准备
  2. 1. 分组查询
    1. a. group by tag
    2. b. group by *
    3. c. group by time
  3. 2. 排序
  4. 3. 查询限制
    1. a. limit
    2. b. slimit
  5. 4. 分页
  6. 5. 小结
  • II. 其他
    1. 0. 系列博文
    2. 1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
    3. 2. 声明
    4. 3. 扫描关注
  • 前面一篇介绍了influxdb中基本的查询操作,在结尾处提到了如果我们希望对查询的结果进行分组,排序,分页时,应该怎么操作,接下来我们看一下上面几个场景的支持

    在开始本文之前,建议先阅读上篇博文: 190813-Influx Sql系列教程八:query数据查询基本篇

    0. 数据准备

    在开始查询之前,先看一下我们准备的数据,其中name,phone为tag, age,blog,id为field

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    > select * from yhh
    name: yhh
    time age blog id name phone
    ---- --- ---- -- ---- -----
    1563889538654374538 26 http://blog.hhui.top 10 一灰灰
    1563889547738266214 30 http://blog.hhui.top 11 一灰灰
    1563889704754695002 30 http://blog.hhui.top 11 一灰灰2
    1563889723440000821 30 http://blog.hhui.top 11 一灰灰3 110
    > show tag keys from yhh
    name: yhh
    tagKey
    ------
    name
    phone

    1. 分组查询

    和sql语法一样,influxdb sql的分组也是使用group by语句,其定义如下

    1
    SELECT_clause FROM_clause [WHERE_clause] GROUP BY [* | <tag_key>[,<tag_key]]

    a. group by tag

    从上面的定义中,有一点需要特别强调,用来分组的必须是tag,也就是说对于influxdb而言,不支持根据field进行分组

    一个实际的演示如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    > select * from yhh group by phone
    name: yhh
    tags: phone=
    time age blog id name
    ---- --- ---- -- ----
    1563889538654374538 26 http://blog.hhui.top 10 一灰灰
    1563889547738266214 30 http://blog.hhui.top 11 一灰灰
    1563889704754695002 30 http://blog.hhui.top 11 一灰灰2

    name: yhh
    tags: phone=110
    time age blog id name
    ---- --- ---- -- ----
    1563889723440000821 30 http://blog.hhui.top 11 一灰灰3

    注意上面的输出结果,比较有意思,分成了两个结构段落,且可以输出完整的数据;而mysql的分组查询条件中一般需要带上分组key,然后实现一些数据上的聚合查询

    如果我的分组中,使用field进行分组查询,会怎样?报错么?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    > select * from yhh group by age
    name: yhh
    tags: age=
    time age blog id name phone
    ---- --- ---- -- ---- -----
    1563889538654374538 26 http://blog.hhui.top 10 一灰灰
    1563889547738266214 30 http://blog.hhui.top 11 一灰灰
    1563889704754695002 30 http://blog.hhui.top 11 一灰灰2
    1563889723440000821 30 http://blog.hhui.top 11 一灰灰3 110

    从上面的case中可以看出,虽然执行了,但是返回的结果并不是我们预期的。

    b. group by *

    另外一个与一般SQL语法不一样的是group by 后面可以跟上*,表示根据所有的tag进行分组,一个测试如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    > select * from yhh group by *
    name: yhh
    tags: name=一灰灰, phone=
    time age blog id
    ---- --- ---- --
    1563889538654374538 26 http://blog.hhui.top 10
    1563889547738266214 30 http://blog.hhui.top 11

    name: yhh
    tags: name=一灰灰2, phone=
    time age blog id
    ---- --- ---- --
    1563889704754695002 30 http://blog.hhui.top 11

    name: yhh
    tags: name=一灰灰3, phone=110
    time age blog id
    ---- --- ---- --
    1563889723440000821 30 http://blog.hhui.top 11
    >

    c. group by time

    除了上面的根据tag进行分组之外,还有一个更高级的特性,根据时间来分组,这个时间还支持一些简单的函数操作

    定义如下

    1
    SELECT <function>(<field_key>) FROM_clause WHERE <time_range> GROUP BY time(<time_interval>),[tag_key] [fill(<fill_option>)]

    我们知道influxdb的一个重要应用场景就是监控的记录,在监控面板上经常会有的就是根据时间进行聚合,比如查询某个服务每分钟的异常数,qps, rt等

    下面给出一个简单的使用case

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # 为了显示方便,将数据的时间戳改成日期方式展示
    > precision rfc3339
    > select * from yhh
    name: yhh
    time age blog id name phone
    ---- --- ---- -- ---- -----
    2019-07-23T13:45:38.654374538Z 26 http://blog.hhui.top 10 一灰灰
    2019-07-23T13:45:47.738266214Z 30 http://blog.hhui.top 11 一灰灰
    2019-07-23T13:48:24.754695002Z 30 http://blog.hhui.top 11 一灰灰2
    2019-07-23T13:48:43.440000821Z 30 http://blog.hhui.top 11 一灰灰3 110
    > select count(*) from yhh where time>'2019-07-23T13:44:38.654374538Z' and time<'2019-07-23T13:50:43.440000821Z' GROUP BY time(2m)
    name: yhh
    time count_age count_blog count_id
    ---- --------- ---------- --------
    2019-07-23T13:44:00Z 2 2 2
    2019-07-23T13:46:00Z 0 0 0
    2019-07-23T13:48:00Z 2 2 2
    2019-07-23T13:50:00Z 0 0 0

    在上面的查询语句中,有几个地方需要说明一下

    • select后面跟上的是单个or多个field的聚合操作,根据时间进行分组时,不允许查询具体的field值,否则会有下面的错误提示

      1
      2
      > select * from yhh where time>'2019-07-23T13:44:38.654374538Z' and time<'2019-07-23T13:50:43.440000821Z'  GROUP BY time(2m)
      ERR: GROUP BY requires at least one aggregate function
    • where条件限定查询的时间范围,否则会得到很多数据

    • group by time(2m) 表示每2分钟做一个分组, group by time(2s)则表示每2s做一个分组

    2. 排序

    在influxdb中排序,只支持针对time进行排序,其他的field,tag(因为是string类型,也没法排)是不能进行排序的

    语法比较简单,如下,根据时间倒序/升序

    1
    order by time desc/asc

    一个简单的实例如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 根据非time进行排序时,直接报错
    > select * from yhh order by age
    ERR: error parsing query: only ORDER BY time supported at this time
    # 根据时间进行倒排
    > select * from yhh order by time desc
    name: yhh
    time age blog id name phone
    ---- --- ---- -- ---- -----
    2019-07-23T13:48:43.440000821Z 30 http://blog.hhui.top 11 一灰灰3 110
    2019-07-23T13:48:24.754695002Z 30 http://blog.hhui.top 11 一灰灰2
    2019-07-23T13:45:47.738266214Z 30 http://blog.hhui.top 11 一灰灰
    2019-07-23T13:45:38.654374538Z 26 http://blog.hhui.top 10 一灰灰
    >

    3. 查询限制

    我们常见的分页就是limit语句,我们常见的limit语句为 limit page, size,可以实现分页;然而在influxdb中则不同,limit后面只能跟上一个数字,表示限定查询的最多条数

    a. limit

    N指定每次measurement返回的point个数

    1
    SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] LIMIT <N>

    下满给出几个实际的case

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    > select * from yhh limit 2
    name: yhh
    time age blog id name phone
    ---- --- ---- -- ---- -----
    2019-07-23T13:45:38.654374538Z 26 http://blog.hhui.top 10 一灰灰
    2019-07-23T13:45:47.738266214Z 30 http://blog.hhui.top 11 一灰灰

    # 分组之后,再限定查询条数
    > select * from yhh group by "name" limit 1
    name: yhh
    tags: name=一灰灰
    time age blog id phone
    ---- --- ---- -- -----
    2019-07-23T13:45:38.654374538Z 26 http://blog.hhui.top 10

    name: yhh
    tags: name=一灰灰2
    time age blog id phone
    ---- --- ---- -- -----
    2019-07-23T13:48:24.754695002Z 30 http://blog.hhui.top 11

    name: yhh
    tags: name=一灰灰3
    time age blog id phone
    ---- --- ---- -- -----
    2019-07-23T13:48:43.440000821Z 30 http://blog.hhui.top 11 110

    b. slimit

    N指定从指定measurement返回的series数

    1
    SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] GROUP BY *[,time(<time_interval>)] [ORDER_BY_clause] SLIMIT <N>

    接下来演示下这个的使用姿势,首先准备插入几条数据,确保tag相同

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    > insert yhh,name=一灰灰,phone=110 blog="http://spring.hhui.top",age=14,id=14
    > insert yhh,name=一灰灰,phone=110 blog="http://spring.hhui.top",age=15,id=15
    > insert yhh,name=一灰灰,phone=110 blog="http://spring.hhui.top",age=16,id=16
    > select * from yhh
    name: yhh
    time age blog id name phone
    ---- --- ---- -- ---- -----
    2019-07-23T13:45:38.654374538Z 26 http://blog.hhui.top 10 一灰灰
    2019-07-23T13:45:47.738266214Z 30 http://blog.hhui.top 11 一灰灰
    2019-07-23T13:48:24.754695002Z 30 http://blog.hhui.top 11 一灰灰2
    2019-07-23T13:48:43.440000821Z 30 http://blog.hhui.top 11 一灰灰3 110
    2019-08-14T11:18:06.804162557Z 14 http://spring.hhui.top 14 一灰灰 110
    2019-08-14T11:18:10.146588721Z 15 http://spring.hhui.top 15 一灰灰 110
    2019-08-14T11:18:12.753413004Z 16 http://spring.hhui.top 16 一灰灰 110
    > show series on test from yhh
    key
    ---
    yhh,name=一灰灰
    yhh,name=一灰灰,phone=110
    yhh,name=一灰灰2
    yhh,name=一灰灰3,phone=110

    如下面的一个使用case

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    > select * from yhh group by * slimit 3
    name: yhh
    tags: name=一灰灰, phone=
    time age blog id
    ---- --- ---- --
    2019-07-23T13:45:38.654374538Z 26 http://blog.hhui.top 10
    2019-07-23T13:45:47.738266214Z 30 http://blog.hhui.top 11

    name: yhh
    tags: name=一灰灰, phone=110
    time age blog id
    ---- --- ---- --
    2019-08-14T11:18:06.804162557Z 14 http://spring.hhui.top 14
    2019-08-14T11:18:10.146588721Z 15 http://spring.hhui.top 15
    2019-08-14T11:18:12.753413004Z 16 http://spring.hhui.top 16

    name: yhh
    tags: name=一灰灰2, phone=
    time age blog id
    ---- --- ---- --
    2019-07-23T13:48:24.754695002Z 30 http://blog.hhui.top 11

    name: yhh
    tags: name=一灰灰3, phone=110
    time age blog id
    ---- --- ---- --
    2019-07-23T13:48:43.440000821Z 30 http://blog.hhui.top 11

    说实话,这一块没看懂,根据官方的文档进行翻译的,没有get这个slimit的特点

    4. 分页

    上面只有point个数限制,但是分页怎么办?难道不支持么?

    在influxdb中,有专门的offset来实现分页

    1
    SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] LIMIT_clause OFFSET <N> [SLIMIT_clause]

    简单来讲,就是limit 条数 offset 偏移

    使用实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    > select * from yhh
    name: yhh
    time age blog id name phone
    ---- --- ---- -- ---- -----
    2019-07-23T13:45:38.654374538Z 26 http://blog.hhui.top 10 一灰灰
    2019-07-23T13:45:47.738266214Z 30 http://blog.hhui.top 11 一灰灰
    2019-07-23T13:48:24.754695002Z 30 http://blog.hhui.top 11 一灰灰2
    2019-07-23T13:48:43.440000821Z 30 http://blog.hhui.top 11 一灰灰3 110
    2019-08-14T11:18:06.804162557Z 14 http://spring.hhui.top 14 一灰灰 110
    2019-08-14T11:18:10.146588721Z 15 http://spring.hhui.top 15 一灰灰 110
    2019-08-14T11:18:12.753413004Z 16 http://spring.hhui.top 16 一灰灰 110
    # 查询结果只有2条数据,从第三个开始(0开始计数)
    > select * from yhh limit 2 offset 3
    name: yhh
    time age blog id name phone
    ---- --- ---- -- ---- -----
    2019-07-23T13:48:43.440000821Z 30 http://blog.hhui.top 11 一灰灰3 110
    2019-08-14T11:18:06.804162557Z 14 http://spring.hhui.top 14 一灰灰 110
    > select * from yhh limit 2 offset 3

    5. 小结

    本篇influxdb的查询篇主要介绍了sql中的三种常用case,分组,排序,分页;虽然使用姿势和我们常见的SQL大同小异,但是一些特殊点需要额外注意一下

    • 分组查询时,注意分组的key必须是time或者tag,分组查询可以返回完整的point
    • 排序,只支持根据时间进行排序,其他的字段都不支持
    • 分页,需要注意limit size offset startIndex和我们一般的使用case不同,它的两个参数分别表示查询的point个数,以及偏移量;而不是传统sql中的页和条数

    II. 其他

    0. 系列博文

    参考博文

    1. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

    一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

    2. 声明

    尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

    3. 扫描关注

    一灰灰blog

    QrCode

    知识星球

    goals

    评论

    Your browser is out-of-date!

    Update your browser to view this website correctly. Update my browser now

    ×