Девятая серия руководств по Influx Sql: запрос данных, основная часть, вторая

база данных

В предыдущей статье были представлены основные операции запросов в influxdb. В конце я упомянул, как это сделать, если мы хотим сгруппировать, отсортировать и разбить на страницы результаты запроса. Далее давайте рассмотрим поддержку вышеуказанных сценариев.

Прежде чем начать эту статью, рекомендуется прочитать предыдущую запись в блоге:190813-Influx Sql: учебник 8: базовый запрос данных

0. Подготовка данных

Перед тем, как начать запрос, давайте взглянем на подготовленные нами данные, которыеname,phoneдля тега,age,blog,idдля поля

> 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заявление, которое определяется следующим образом

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

a. group by tag

Из вышеприведенного определения необходимо подчеркнуть один момент,Тег, используемый для группировки, должен быть, то есть для influxdb группировка по полю не поддерживается

Фактическая демонстрация выглядит следующим образом:

> 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 обычно требуют ввода ключа группировки, а затем реализации некоторых запросов агрегирования данных.

Что, если я использую поле для группировки запросов в своей группировке? Это неправильно?

> 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

Как видно из приведенного выше случая, хотя он и выполняется, возвращаемый результат не такой, как мы ожидали.

b. group by *

Еще одно отличие от общего синтаксиса SQL:group byможно будет позже*, что означает сгруппировать по всем тегам, тест выглядит следующим образом

> 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

В дополнение к вышеупомянутой группировке по тегам, есть более продвинутая функция, группировка по времени, на этот раз также поддерживает некоторые простые функциональные операции.

Определяется следующим образом

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

Мы знаем, что важным сценарием приложения influxdb является мониторинг записей.На панели мониторинга часто можно найти агрегацию на основе времени, например запрос количества исключений в минуту для службы, qps, rt и т. д.

Простой пример использования приведен ниже

# 为了显示方便,将数据的时间戳改成日期方式展示
> 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 * 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)Это означает делать группу каждые 2 секунды

2. Сортировать

Сортировка в influxdb поддерживает только сортировку по времени, остальные поля и теги (поскольку они строкового типа, их нельзя сортировать) не могут быть отсортированы.

Синтаксис относительно прост, как показано ниже, в соответствии с обратным/возрастающим порядком времени.

order by time desc/asc

Простой пример выглядит следующим образом

# 根据非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 page, size, пейджинг может быть достигнут, однако в influxdb он отличается, за limit может следовать только число, указывающее максимальное количество ограниченных запросов

a. limit

N указывает количество точек, возвращаемых каждым измерением

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

Приведите несколько реальных случаев под полным

> 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 указывает количество серий, возвращенных из указанного измерения

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

Далее я продемонстрирую, как это использовать.Во-первых, подготовьтесь вставить несколько фрагментов данных, чтобы убедиться, что теги совпадают.

> 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

Например, следующий случай использования

> 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

Честно говоря, я не понял этот кусок, он был переведен по официальному документу, и нет никакой особенности лимита получения.

4. Пагинация

Выше есть только ограничение на количество точек, а как насчет пейджинга? Не поддерживаете?

В influxdb есть специальное смещение для реализации пейджинга

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

Проще говоря, этоlimit 条数 offset 偏移

Пример использования

> 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: группировка, сортировка и разбиение по страницам; хотя положение использования похоже на наш обычный SQL, но на некоторые особые моменты необходимо обратить особое внимание.

  • При группировке запроса обратите внимание, что ключом группировки должно быть время или тег, а группирующий запрос может возвращать полную точку.
  • Сортировка, поддерживает только сортировку по времени, другие поля не поддерживаются
  • Пагинация, нужно вниманиеlimit size offset startIndexВ отличие от нашего общего варианта использования, его два параметра представляют количество точек в запросе и смещение соответственно; вместо количества страниц и записей в традиционном sql

II. Другое

0. Серия сообщений в блоге

Справочная запись в блоге

1. Серый блог:liuyueyi.github.io/hexblog

Серый личный блог, записывающий все посты блога по учебе и работе, приглашаю всех в гости

2. Заявление

Это не так хорошо, как письмо веры.Контент уже был размещен, и это чисто из семьи.Из-за ограниченных личных возможностей неизбежно будут упущения и ошибки.Если вы найдете ошибки или лучше предложения, вы можете критиковать и исправлять их.

3. Сканируйте внимание

серый блог

image