Influxdb中Select查詢請求結果涉及到的一些資料結構
女主宣言
本文將給大家介紹的是在Influxdb中Select查詢請求結果中涉及到的一些資料結構,對於Influxsql的查詢語句不太熟悉的同學,可以在先了解了解:
https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration
資料結構
1 Series
Series其實就是measurement和tags的組合,tags是tag key和tag value的map.這個Tags的id是如何產生的呢,其實就是對tag key和tag value編碼到
[]byte: agkey1\0tagkey2\0...\tagvalue1\0tagvalue2\0...
具體實現定義在query/point.go中的encodeTags。
2 Row
Row表示查詢結果集中的每一行, 其中的Values表示是返回的Fields的集合
3 bufFloatIterator
bufFloatIterator相當於c裡面的連結串列元素,itr指向下一個元素的指標,buf表示當前元素,即FloatPoint型別的連結串列的迭代器。
FloatPoint
FloatPoint定義在query/point.gen.go中, 表示一條field為float型別的資料
Next實現
當前Iterator的值不為空,就返回當前的buf, 當前的值為空,就返回itr.itr.Next(),即指向的下一個元素
unread: iterator回退操作
4 floatMergeIterator
floatMergeIterator組合了多個floatIterator
因為要作merge, 這裡需要對其管理的所有Interator元素作排序,這裡用到了golang的container/heap作堆排。
因為要用golang的container/heap來管理,需要實現下面規定的介面,
floatMergeIterator定義中的floatMergeHeap即實現了上面的介面,我們主要來看一下比較函式的實現,比較的其實就是FloatPoint。
比較的優先順序先是FloatPoint的measurement名,然後是tagset id, 最後是time,將這個比較函式我們就可以知道.
結構
Next函式的實現
一張長圖
結合上面的Less函式可知,針對所有的FloatPoint, 排序的最小單位是Window(由measurement name, tagset id, time window組成),屬性同一Window的FloatPoint不再排序。如果是按升級規則遍歷,則遍歷的結果是按Window從小到大排,但同一Window內部的多條Point,時間不一定是從小到大的。
5
floatSortedMergeIterator
同樣它也藉助了golang/container中的heap, 與floatMergeIterator相比它實現了全體Point的排序遍歷,我們來看一下是如何實現的;
pop函式:
對所有Iterator包含的所在FloatPoint,都從排序,沒有Window的概念.
6 floatIteratorScanner
floatIteratorScanner將floatIterator的值掃描到map裡。
ScanAt
在floatIterator中找滿足條件的Point, 條件是ts, name, tags均相等,實現比較簡單
7 floatParallelIterator
在一個單獨的goroutine裡面迴圈呼叫floatIterator.Next獲取FloatPoint,然後寫入到chan中:
使用的時候,呼叫Next, 從上面的Chan中讀資料:
8 floatLimitIterator
限制在每個window中讀取的Point個數
next
9 floatFillIterator
執行在select中的Group by time fill(...), 在當前的interval的window中,如果沒有查詢到值,則使用相應的添充規則生成相應的值
具體可參見:
group-by-time-intervals-and-fill
定義:
10 floatInterruptIterator
每遍歷N條資料後,檢測下遍歷是否需要中斷
定義:
Next
11 floatReduceFloatIterator
對每個interval內的資料作reduce操作
定義:
reduce()
返回處理後的points, 函式較長,但邏輯比較簡單
12 CallIterator
CallIterator實現了聚合函式的Iterator: count, min, max, sum, first, last, mean, distinct,Median....主要是使用我們上面介紹的一系列的ReduceIterator,提供相應的Reducer, 實現AggregateFloat和Emit這兩個函式
13 IteratorOptions
構建Iterator時用到的一些配置選項, 包含的內容較多
定義:
14 Cursor
select後會得到這個cursor,用來遍歷查詢結果
定義:
Scan
15 floatIteratorMapper
*IteratorMapper系列, 主要作用是遍歷cursor
定義
我們來看一下Next介面, 對當前的cursor作scan來返回FloatPoint
總結
以上就是Influxdb的select查詢請求結果涉及到的一些資料結構
HULK一線技術雜談
由360雲平臺團隊打造的技術分享公眾號,內容涉及雲端計算、資料庫、大資料、監控、泛前端、自動化測試等眾多技術領域,通過夯實的技術積累和豐富的一線實戰經驗,為你帶來最有料的技術分享
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555491/viewspace-2222558/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 23.資料結構 查詢資料結構
- 重學資料結構(八、查詢)資料結構
- C# dataGridView展示資料庫查詢結果C#View資料庫
- 【PHP資料結構】雜湊表查詢PHP資料結構
- Java資料結構(十五)—— 多路查詢樹Java資料結構
- 如何分頁顯示資料庫查詢結果?資料庫
- mysql查詢結果多列拼接查詢MySql
- [20190306]奇怪的查詢結果.txt
- 判斷 Eloqument 模型查詢資料結果是否為空模型
- MySQL查詢結果匯出方式總結MySql
- Mybatis 查詢語句結果集總結MyBatis
- mybatis查詢mysql 資料庫中 BLOB欄位,結果出現亂碼MyBatisMySql資料庫
- 樹狀資料結構儲存方式——查詢篇資料結構
- fiddler 修改請求介面的返回結果
- 資料結構與演算法整理總結---二分查詢資料結構演算法
- MySQL查詢select語句的執行流程以及InnoDB記憶體結構MySql記憶體
- Mybatis模糊查詢結果為空MyBatis
- ps aux查詢結果解釋UX
- 查詢最佳化——查詢樹結構
- 記錄oracle中查詢資料0.xx結果為.xx的解決辦法Oracle
- 資料結構與演算法-二分查詢資料結構演算法
- 資料結構與演算法:查詢演算法資料結構演算法
- 【資料結構與演算法】—— 二分查詢資料結構演算法
- [資料結構] 二分查詢 (四種寫法)資料結構
- InfluxDB中的inmem記憶體索引結構解析UX記憶體索引
- 資料結構與演算法知識點總結(5)查詢樹資料結構演算法
- 資料結構-並查集資料結構並查集
- 封裝springmvc處理ajax請求結果封裝SpringMVC
- 請求支援,我們被非結構化資料包圍了!
- 資料結構之查詢(順序、折半、分塊查詢,B樹、B+樹)資料結構
- ORDER對查詢結果進行排序排序
- Redis中的資料結構Redis資料結構
- JavaScript 中的 資料結構JavaScript資料結構
- PostgreSQL 原始碼解讀(205)- 查詢#118(資料結構RangeTblEntry)SQL原始碼資料結構
- 資料結構與演算法-二叉查詢樹資料結構演算法
- 資料結構與演算法 第五章 查詢資料結構演算法
- mysql根據查詢結果批量更新多條資料(插入或更新)MySql
- 資料結構的一些基本概念資料結構