InfluxDB與傳統(tǒng)數(shù)據(jù)庫在概念上有許多的不同,本文主要介紹InfluxDB中數(shù)據(jù)結(jié)構(gòu)的基本概念,以及使用中要注意問題。
一、與傳統(tǒng)數(shù)據(jù)庫中的名詞做比較
| influxDB中的名詞 | 傳統(tǒng)數(shù)據(jù)庫中的概念 | 解釋 |
|---|---|---|
| database | database | 數(shù)據(jù)庫 |
| measurement | table | 數(shù)據(jù)庫中的表 |
| points | record | 表里面的一行數(shù)據(jù) |
| retention policy | partition policy | 數(shù)據(jù)保留策略:InfluxDB不提供刪除操作,通過設(shè)置數(shù)據(jù)保留策略批量刪除過期的數(shù)據(jù) |
二、InfluxDB中獨(dú)有的概念
時(shí)間戳是時(shí)序數(shù)據(jù)庫的靈魂,其他數(shù)據(jù)庫對(duì)時(shí)間戳非常不友好,具體表現(xiàn)在如下幾點(diǎn):
- 數(shù)據(jù)記錄:必須帶時(shí)間戳
- 數(shù)據(jù)存儲(chǔ):按照時(shí)間排列
- 數(shù)據(jù)查詢:必須帶時(shí)間條件
2.1 Point
Point相當(dāng)于傳統(tǒng)數(shù)據(jù)庫里的一行數(shù)據(jù),它由時(shí)間(time)、維度(tags)、以及指標(biāo)(field)、組成。如下表所示:
| 英文名稱 | 中文名稱 | 含義 |
|---|---|---|
| time | 時(shí)間列 | 每個(gè)數(shù)據(jù)記錄時(shí)間,是數(shù)據(jù)庫中的主索引(會(huì)自動(dòng)生成) |
| tags | 維度列 | 各種有索引的屬性:地區(qū),海拔 |
| fields | 指標(biāo)列 | 各種記錄值(沒有索引的屬性)也就是記錄的值:溫度, 濕度 |

2.2 series
series的概念稍微有點(diǎn)復(fù)雜,它表示的是所有tags值得排列組合。
下面舉一個(gè)具體一點(diǎn)的案例。假設(shè)現(xiàn)有measurement表cpu有兩個(gè)tag,分別是cpu和host,前者表示cpu的核編號(hào),后者表示機(jī)器名。加入有兩臺(tái)機(jī)器ResourcePool-0246-billing07和billing07,他們都有兩個(gè)核cpu1和cpu2,那么這兩個(gè)tag的排列組合就有4個(gè),因此使用show series from cpu查詢出來的結(jié)果就有四條記錄。如果將它們各自關(guān)聯(lián)的數(shù)據(jù)點(diǎn)按照時(shí)間序列描繪在一張圖上,那么可以畫出四條折線。因?yàn)樗鼈兇碇膫€(gè)實(shí)例,每個(gè)實(shí)例都需要cpu和host兩個(gè)tag組合起來才能唯一描述。
> show series from cpu
key
cpu,cpu=cpu1,host=ResourcePool-0246-billing07
cpu,cpu=cpu1,host=billing07
cpu,cpu=cpu2,host=ResourcePool-0246-billing07
cpu,cpu=cpu2,host=billing07
三、使用注意
3.1 坑點(diǎn)
- influxdb只有插入(insert)和查詢(select)語句,沒有更新(update)和刪除(delete)語句。
- time 相當(dāng)于表的主鍵,當(dāng)一條數(shù)據(jù)的time和tags完全相同時(shí)候,新數(shù)據(jù)會(huì)替換掉舊數(shù)據(jù),舊數(shù)據(jù)則丟失(線上環(huán)境尤其要注意)。
- tags 和time可以作為排序字段,field則不可以。如:
ORDER BY time DESC. - 設(shè)置了保存策略后,若此保存策略為設(shè)置成默認(rèn)保存策略(一個(gè)庫可以有多個(gè)保存策略),則在查詢時(shí),表名(measurement)前,要加上保存策略。
舉例:
保留策略為two-hour不是默認(rèn)保存策略,則查詢時(shí)候,需要指定其保存策略。例如查詢表cpu中使用非默認(rèn)策略two-hour保存的數(shù)據(jù):
select * from two-hour.cpu where time > now() -10
- fields和tags的字段類型是由存入的第一條記錄值決定,一旦確定,后序不得變更,否則數(shù)據(jù)插入將失敗。
舉例:
- 如第一條記錄fieldA的值為2,想插入一條記錄,fieldA字段值為3.14的值,就會(huì)報(bào)錯(cuò)。因?yàn)樵撟侄我呀?jīng)被初始化為整型了。
- 如第一條記錄fieldB存儲(chǔ)的是3,想插入一條記錄,fieldB字段值為hello,則也會(huì)報(bào)錯(cuò),該字段已被初始化成整型,不能再寫入字符串了。
避坑提示:建議只使用字符串類型和浮點(diǎn)類型,把所有的整型,長(zhǎng)整型,浮點(diǎn)型,雙精度型統(tǒng)一轉(zhuǎn)為小數(shù)格式的浮點(diǎn)類型,再寫入數(shù)據(jù)庫,字符串類型的不用做轉(zhuǎn)換,這樣就不會(huì)出現(xiàn)插入數(shù)據(jù)失敗和丟失數(shù)據(jù)了。