В предыдущей статье были представлены основные операции запросов в 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. Серия сообщений в блоге
- 190813-Influx Sql: учебник 8: базовый запрос данных
- 190730-Influx Sql, седьмое руководство: удалить данные
- 190729-шестой учебник серии Influx Sql: вставка для изменения данных
- 190726-Пятое руководство серии Influx Sql: вставка добавления данных
- 190723-Influx Sql, четвертый учебник: серия/точка/тег/поле
- 190721-3 учебник серии Influx Sql: таблица измерений
- 190719-Influx Sql: руководство 2: политика сохранения политики сохранения
- 190718-Influx Sql: учебник 1: база данных базы данных
- 190717-Нулевой учебник серии Influx Sql: установка и введение в использование influx-cli
- 190509 - Временные метки InfluxDb отображаются в формате даты
- 190506-модификация конфигурации InfluxDB
- 190505-Управление разрешениями InfluxDB
- 180727-Стратегия резервного копирования и восстановления базы данных временных рядов InfluxDB
- 180726 — Краткое изложение основных концепций InfluxDB
- 180725-InfluxDB-v1.6.0 сводка по установке и простому использованию
Справочная запись в блоге
1. Серый блог:liuyueyi.github.io/hexblog
Серый личный блог, записывающий все посты блога по учебе и работе, приглашаю всех в гости
2. Заявление
Это не так хорошо, как письмо веры.Контент уже был размещен, и это чисто из семьи.Из-за ограниченных личных возможностей неизбежно будут упущения и ошибки.Если вы найдете ошибки или лучше предложения, вы можете критиковать и исправлять их.
- Адрес вейбо:Блог Маленького Серого
- QQ: серо-серый / 3302797840
3. Сканируйте внимание
серый блог