本文匯總了Lindorm時序引擎在數據寫入、刪除、查詢時的常見問題,方便您更加熟悉時序引擎的使用方法,規避因為不當操作可能導致的性能問題,提高使用效率。
問題導覽
數據寫入
數據查詢
數據刪除
功能及性能
時序表設計
數據寫入
推薦的最優數據寫入方式是什么?
Java:推薦您通過Java Native SDK寫入,該方式可以自動攢批寫入和重試。詳細說明,請參見通過Java Native SDK寫入數據。
非Java:推薦使用行協議(Line Protocol)寫入。詳細說明,請參見行協議寫入。
時序引擎支持的時間精度是什么?
時序引擎支持毫秒(ms)級別的時間存儲,更高精度的數據會被轉換為毫秒精度進行存儲。因此,如果寫入比毫秒精度更高的時間數據,會導致原數據的精度丟失。
使用行協議寫入數據時需要注意什么?
使用行協議寫入時您需要注意以下三點:
Tag Key、Tag Value中的字符串不需要添加半角單引號('')或半角雙引號(""),兩者均默認為STRING類型。如果添加了半角單引號('')或半角雙引號(""),則引號會被判定為字符串的一部分。
Field Key(Field名)固定為字符串類型,不需要添加半角單引號('')或半角雙引號("")。
Field Value(Field值)需注意數據類型:如果是字符串類型,則必須添加半角雙引號(""),否則系統會報錯;如果是INT類型,則必須在數值后添加后綴
i
,例如12i
、101i
,否則INT類型會被識別為FLOAT類型。
數據寫入成功但無法查詢到是什么原因?
請檢查是否設置了數據有效期TTL。如果寫入數據的時間超過TTL,則該數據寫入后會被清理,導致查詢結果為空。
想將Tag列的值設置為NULL
,寫入時需要顯式寫入NULL
嗎?
不需要,在寫入數據時忽略該Tag即可。假設表sensor
共有5列:device_id、region、time、temperature和humidity,想讓region列值為NULL,寫入時忽略region寫入即可,例如:INSERT INTO sensor(device_id, time, temperature, humidity) VALUES ('id123', current_timestamp, 37, 70);
。
數據查詢
查詢方式最推薦使用哪種?
推薦您通過JDBC Driver連接時序引擎,并使用prepareStatement綁參方式進行查詢。使用prepareStatement綁參方式可以減少服務端資源占用,提高查詢性能。使用方式說明,請參見教程:通過JDBC Driver連接并訪問Lindorm時序引擎。
使用ORDER BY LIMIT
可能會有什么性能問題,有更好的查詢方式嗎?
使用ORDER BY LIMIT
查詢時,數據庫需要在內存中對數據進行排序。如果命中的數據量過大,可能會導致服務端占用大量內存進而引發穩定性問題。因此,為獲得更高的查詢效率,建議您減小查詢的時間范圍或增加更多的Tag條件,盡量減少查詢命中的數據量。
此外,時序數據默認按照時間線返回時間遞增的數據,無需添加order by time ASC
就可以得到以時間線為基準、按時間遞增排序的數據。如果需要查詢每條時間線的最后幾條數據,可以使用最新值函數LATEST來代替ORDER BY time DESC
。具體語法說明,請參見最新值查詢。
是否支持在WHERE條件里對同一個Field使用多個過濾條件?
暫不支持對同一個Field列、不同的Field列使用多個過濾條件。
Field列過濾是讀取數據后再進行過濾的操作,效率較低且不支持同時對多個Field進行過濾,因此建議您使用Tag列進行過濾。
使用COUNT
查詢如何獲得更高的效率?
指定一個數值類型的Field列進行COUNT
計算的效率最高。
使用Native SDK查詢時偶發報錯,內容包含關鍵詞Metaspace
,應該怎么解決?
使用Native SDK查詢時需要編譯SQL語句,占用了過多的元空間(Metaspace),推薦您通過JDBC Driver連接時序引擎,并使用prepareStatement綁定參數的方式進行查詢。使用方式說明,請參見教程:通過JDBC Driver連接并訪問Lindorm時序引擎。
創建的連續查詢CQ未生效是什么原因?
使用CREATE CONTINUOUS QUERY
語句創建的連續查詢未生效的可能原因如下:
INSERT INTO
指定的表還未創建。INSERT INTO
指定的表已創建,但該表的Schema與CREATE CONTINUOUS QUERY
語句指定的Schema不一致。
如果您的時序引擎為3.4.41及以上版本,建議您結合控制臺查詢日志進行排查。
查詢耗時很長是什么原因?
請檢查查詢條件,如果未添加Tag過濾條件或者時間范圍將會掃描全表,導致查詢耗時很長。
數據刪除
是否支持刪除一段時間范圍的數據?
暫不支持刪除指定時間范圍內的數據。當前僅支持根據指定Tag條件進行刪除,不支持根據Field和時間條件刪除。
大量的刪除操作會有什么風險?
時序引擎在執行刪除操作時并不是直接刪除數據,而是為需要刪除的數據添加刪除標記,確保這些數據不再被查詢到,直到這些數據超過有效期TTL被徹底清理。因此,如果提交了大量的刪除請求,則會產生大量的刪除標記,導致查詢以及后臺數據的合并性能變差,更嚴重時可能會導致服務不可用。
建議您盡量避免提交大量的刪除請求,如果有數據空間清理的需求,可以通過設置TTL來實現。
是否支持刪除特定字段?
暫不支持字段級別的刪除操作。如果某個字段不再使用,只要不再查詢該字段便不會影響性能。
功能及性能
云盤擴容是否會重啟服務?
云盤擴容不會導致進程重啟,不會影響您的服務。
冷熱分界線設置后多久可以生效?
冷數據歸檔過程是在后臺數據合并時進行的,當數據符合歸檔要求時將整體被歸檔至冷存儲中。但為了避免冷數據頻繁參與合并,時序引擎默認要求數據寫入7天后才會被歸檔至冷存儲,因此,如果寫入的數據已經符合歸檔要求,通常還需要等待7天該數據才會被歸檔至冷存儲,即7天后冷存策略(冷熱分界線)才會生效。
數據歸檔至冷存儲后還能再轉移回熱存儲嗎?
暫不支持將轉移至冷存儲的數據轉移回熱存儲。因此建議您合理設置冷存儲時間,經常查詢的數據不要歸檔至冷存儲。
是否支持查看表級別的磁盤占用情況?
暫不支持查看表級別的存儲空間占用情況。目前僅支持查看數據庫級別的磁盤占用情況,如需查看請聯系Lindorm技術支持(釘釘號:s0s3eg3)。
時序引擎的壓縮率不太理想是什么原因?
時序引擎對INT類型的數據壓縮率更高,如果壓縮率不夠理想,可以檢查測試數據是否為INT類型。
數據寫入時會同時寫入至內存和日志,日志數據會占用一定的存儲空間,進而導致整體壓縮率不夠理想。
為獲得較高的壓縮率,新寫入的數據不會立刻被壓縮,需要等待在后臺與已有數據合并后才會被壓縮,該過程通常需要10小時以上。
時序表設計
時序表設計時需注意什么?
需注意Tag的設計,避免Tag的取值范圍不可控。應盡量避免使用時間、進程號等易變數據作為表的Tag,此類數據會導致時間線數量及時間線索引膨脹,不利于查詢和存儲。