序數(shù)據(jù)模型設(shè)計(jì)改造)
文章目錄每日一句正能量一、前言模型改造是遷移的核心二、模型差異分析2.1 InfluxDB模型特點(diǎn)2.2 KaiwuDB模型特點(diǎn)2.3 模型對比三、表結(jié)構(gòu)設(shè)計(jì)3.1 單表設(shè)計(jì)3.2 多表設(shè)計(jì)3.3 分區(qū)表設(shè)計(jì)四、標(biāo)簽設(shè)計(jì)優(yōu)化4.1 主標(biāo)簽設(shè)計(jì)4.2 普通標(biāo)簽設(shè)計(jì)4.3 字段列設(shè)計(jì)五、模型改造實(shí)戰(zhàn)5.1 改造前分析5.2 改造方案5.3 改造后優(yōu)勢六、性能優(yōu)化6.1 索引優(yōu)化6.2 分區(qū)優(yōu)化6.3 查詢優(yōu)化七、常見問題7.1 高基數(shù)問題7.2 數(shù)據(jù)類型問題7.3 時(shí)間精度問題八、總結(jié)每日一句正能量你走的每一步都算數(shù)即使現(xiàn)在看不見回報(bào)時(shí)間會在未來的某個(gè)轉(zhuǎn)角給你驚喜。所有經(jīng)歷都有價(jià)值回報(bào)可能延遲但一定會以某種形式出現(xiàn)。你讀的書、熬的夜、練習(xí)的技能都在默默為那個(gè)“轉(zhuǎn)角驚喜”編織底色。一、前言模型改造是遷移的核心前面十四篇文章我分享了MySQL和InfluxDB遷移KaiwuDB的完整經(jīng)驗(yàn)。有讀者問“遷移完成后發(fā)現(xiàn)原有的模型設(shè)計(jì)在KaiwuDB上并不合適查詢性能不理想怎么辦”這是個(gè)好問題。InfluxDB和KaiwuDB雖然都是時(shí)序數(shù)據(jù)庫但數(shù)據(jù)模型設(shè)計(jì)理念不同。InfluxDB的tag/field模型靈活但查詢受限KaiwuDB的主標(biāo)簽/普通標(biāo)簽/字段列模型更規(guī)范但需要合理設(shè)計(jì)。本文就把InfluxDB到KaiwuDB時(shí)序數(shù)據(jù)模型設(shè)計(jì)改造的完整經(jīng)驗(yàn)分享出來包括模型差異分析、表結(jié)構(gòu)設(shè)計(jì)、標(biāo)簽設(shè)計(jì)優(yōu)化。二、模型差異分析2.1 InfluxDB模型特點(diǎn)InfluxDB采用measurement tag field模型Measurement: sensor_data Tags: device_id, location, status Fields: temperature, humidity, pressure Time: timestamp特點(diǎn)靈活tag和field可以動態(tài)添加自動索引tag自動創(chuàng)建索引無模式不需要預(yù)先定義表結(jié)構(gòu)高寫入適合高頻寫入場景問題高基數(shù)tag值過多導(dǎo)致性能下降查詢受限不支持復(fù)雜SQL查詢數(shù)據(jù)膨脹tag變化導(dǎo)致數(shù)據(jù)冗余2.2 KaiwuDB模型特點(diǎn)KaiwuDB時(shí)序引擎采用主標(biāo)簽 普通標(biāo)簽 字段列模型CREATETABLEsensor_data(timeTIMESTAMPNOTNULL,device_id STRINGNOTNULL,-- 主標(biāo)簽location STRING,-- 普通標(biāo)簽statusSTRING,-- 普通標(biāo)簽temperatureFLOAT,-- 字段列humidityFLOAT,-- 字段列pressureFLOAT-- 字段列);特點(diǎn)規(guī)范需要預(yù)先定義表結(jié)構(gòu)強(qiáng)類型字段類型明確SQL支持支持標(biāo)準(zhǔn)SQL查詢可擴(kuò)展支持水平擴(kuò)展優(yōu)勢查詢靈活支持復(fù)雜SQL查詢性能穩(wěn)定不會因?yàn)楦呋鶖?shù)導(dǎo)致性能下降數(shù)據(jù)一致強(qiáng)類型保證數(shù)據(jù)一致性2.3 模型對比維度InfluxDBKaiwuDB說明數(shù)據(jù)模型measurement tag field主標(biāo)簽 普通標(biāo)簽 字段列概念對應(yīng)模式定義無模式強(qiáng)模式KaiwuDB需要預(yù)先定義索引tag自動索引主標(biāo)簽自動索引都需要設(shè)計(jì)標(biāo)簽查詢語言InfluxQLSQLKaiwuDB更標(biāo)準(zhǔn)高基數(shù)性能下降性能穩(wěn)定KaiwuDB更優(yōu)擴(kuò)展性垂直擴(kuò)展水平擴(kuò)展KaiwuDB更優(yōu)三、表結(jié)構(gòu)設(shè)計(jì)3.1 單表設(shè)計(jì)InfluxDB單表Measurement: sensor_data Tags: device_id, location Fields: temperature, humidityKaiwuDB單表CREATETABLEsensor_data(timeTIMESTAMPNOTNULL,device_id STRINGNOTNULL,-- 主標(biāo)簽location STRING,-- 普通標(biāo)簽temperatureFLOAT,-- 字段列humidityFLOAT-- 字段列);3.2 多表設(shè)計(jì)InfluxDB多表Measurement: temperature_data Tags: device_id, location Fields: temperature Measurement: humidity_data Tags: device_id, location Fields: humidityKaiwuDB多表-- 溫度表CREATETABLEtemperature_data(timeTIMESTAMPNOTNULL,device_id STRINGNOTNULL,-- 主標(biāo)簽location STRING,-- 普通標(biāo)簽temperatureFLOAT-- 字段列);-- 濕度表CREATETABLEhumidity_data(timeTIMESTAMPNOTNULL,device_id STRINGNOTNULL,-- 主標(biāo)簽location STRING,-- 普通標(biāo)簽humidityFLOAT-- 字段列);3.3 分區(qū)表設(shè)計(jì)InfluxDB分區(qū)InfluxDB自動按時(shí)間分區(qū)不需要手動設(shè)計(jì)。KaiwuDB分區(qū)-- 按時(shí)間分區(qū)CREATETABLEsensor_data(timeTIMESTAMPNOTNULL,device_id STRINGNOTNULL,location STRING,temperatureFLOAT,humidityFLOAT,PRIMARYKEY(time,device_id))PARTITIONBYRANGE(time);-- 創(chuàng)建分區(qū)CREATETABLEsensor_data_2023_q1PARTITIONOFsensor_dataFORVALUESFROM(2023-01-01)TO(2023-04-01);CREATETABLEsensor_data_2023_q2PARTITIONOFsensor_dataFORVALUESFROM(2023-04-01)TO(2023-07-01);CREATETABLEsensor_data_2023_q3PARTITIONOFsensor_dataFORVALUESFROM(2023-07-01)TO(2023-10-01);CREATETABLEsensor_data_2023_q4PARTITIONOFsensor_dataFORVALUESFROM(2023-10-01)TO(2024-01-01);四、標(biāo)簽設(shè)計(jì)優(yōu)化4.1 主標(biāo)簽設(shè)計(jì)主標(biāo)簽選擇原則高選擇性值分布均勻避免熱點(diǎn)穩(wěn)定性值不會頻繁變化查詢常用經(jīng)常用于WHERE條件InfluxDB tagtags: device_id, location, statusKaiwuDB主標(biāo)簽-- device_id作為主標(biāo)簽CREATETABLEsensor_data(timeTIMESTAMPNOTNULL,device_id STRINGNOTNULL,-- 主標(biāo)簽location STRING,-- 普通標(biāo)簽statusSTRING,-- 普通標(biāo)簽temperatureFLOAT,humidityFLOAT);4.2 普通標(biāo)簽設(shè)計(jì)普通標(biāo)簽選擇原則輔助查詢用于過濾和分組低基數(shù)值數(shù)量不會太多可變性值可以變化InfluxDB tagtags: device_id, location, statusKaiwuDB普通標(biāo)簽-- location和status作為普通標(biāo)簽CREATETABLEsensor_data(timeTIMESTAMPNOTNULL,device_id STRINGNOTNULL,-- 主標(biāo)簽location STRING,-- 普通標(biāo)簽statusSTRING,-- 普通標(biāo)簽temperatureFLOAT,humidityFLOAT);4.3 字段列設(shè)計(jì)字段列選擇原則數(shù)值型溫度、濕度、壓力等變化頻繁值會隨時(shí)間變化聚合需求需要計(jì)算平均值、最大值等InfluxDB fieldfields: temperature, humidity, pressureKaiwuDB字段列-- temperature, humidity, pressure作為字段列CREATETABLEsensor_data(timeTIMESTAMPNOTNULL,device_id STRINGNOTNULL,location STRING,temperatureFLOAT,-- 字段列humidityFLOAT,-- 字段列pressureFLOAT-- 字段列);五、模型改造實(shí)戰(zhàn)5.1 改造前分析InfluxDB模型Measurement: sensor_data Tags: device_id, location, status, firmware_version Fields: temperature, humidity, pressure, voltage, current問題分析高基數(shù)firmware_version值變化頻繁導(dǎo)致高基數(shù)數(shù)據(jù)膨脹tag變化導(dǎo)致數(shù)據(jù)冗余查詢受限不支持復(fù)雜SQL查詢5.2 改造方案KaiwuDB模型-- 主表設(shè)備基本信息CREATETABLEdevice_info(device_id STRINGPRIMARYKEY,location STRING,statusSTRING,firmware_version STRING,created_atTIMESTAMP);-- 時(shí)序表傳感器數(shù)據(jù)CREATETABLEsensor_data(timeTIMESTAMPNOTNULL,device_id STRINGNOTNULL,-- 主標(biāo)簽temperatureFLOAT,-- 字段列humidityFLOAT,-- 字段列pressureFLOAT,-- 字段列voltageFLOAT,-- 字段列currentFLOAT-- 字段列);-- 時(shí)序表設(shè)備狀態(tài)CREATETABLEdevice_status(timeTIMESTAMPNOTNULL,device_id STRINGNOTNULL,-- 主標(biāo)簽statusSTRING,-- 普通標(biāo)簽firmware_version STRING-- 普通標(biāo)簽);5.3 改造后優(yōu)勢優(yōu)勢1降低高基數(shù)-- 改造前firmware_version作為tag導(dǎo)致高基數(shù)-- 改造后firmware_version作為普通標(biāo)簽降低高基數(shù)-- 查詢設(shè)備信息SELECT*FROMdevice_infoWHEREdevice_iddevice_001;-- 查詢傳感器數(shù)據(jù)SELECT*FROMsensor_dataWHEREdevice_iddevice_001ANDtimenow()-INTERVAL1 hour;優(yōu)勢2支持復(fù)雜查詢-- 改造前InfluxQL不支持JOIN-- 改造后SQL支持JOIN-- 查詢設(shè)備最新狀態(tài)和傳感器數(shù)據(jù)SELECTd.device_id,d.location,d.status,s.temperature,s.humidity,s.pressureFROMdevice_info dJOINsensor_data sONd.device_ids.device_idWHEREs.timenow()-INTERVAL1 hourORDERBYs.timeDESC;優(yōu)勢3數(shù)據(jù)一致性-- 改造前tag變化導(dǎo)致數(shù)據(jù)冗余-- 改造后強(qiáng)類型保證數(shù)據(jù)一致性-- 更新設(shè)備信息UPDATEdevice_infoSETfirmware_versionv2.0WHEREdevice_iddevice_001;-- 查詢設(shè)備信息SELECT*FROMdevice_infoWHEREdevice_iddevice_001;六、性能優(yōu)化6.1 索引優(yōu)化-- 創(chuàng)建主標(biāo)簽索引自動創(chuàng)建-- device_id已經(jīng)是主標(biāo)簽自動索引-- 創(chuàng)建普通標(biāo)簽索引CREATEINDEXidx_locationONsensor_data(location);CREATEINDEXidx_statusONdevice_status(status);-- 創(chuàng)建時(shí)間索引自動創(chuàng)建-- time已經(jīng)是主鍵的一部分自動索引6.2 分區(qū)優(yōu)化-- 按時(shí)間分區(qū)CREATETABLEsensor_data(timeTIMESTAMPNOTNULL,device_id STRINGNOTNULL,temperatureFLOAT,humidityFLOAT,PRIMARYKEY(time,device_id))PARTITIONBYRANGE(time);-- 創(chuàng)建分區(qū)CREATETABLEsensor_data_2023_q1PARTITIONOFsensor_dataFORVALUESFROM(2023-01-01)TO(2023-04-01);6.3 查詢優(yōu)化-- 使用索引查詢EXPLAINANALYZESELECT*FROMsensor_dataWHEREdevice_iddevice_001ANDtimenow()-INTERVAL1 hour;-- 使用分區(qū)查詢EXPLAINANALYZESELECT*FROMsensor_data_2023_q1WHEREdevice_iddevice_001;七、常見問題7.1 高基數(shù)問題問題device_id數(shù)量過多導(dǎo)致主標(biāo)簽高基數(shù)解決方案-- 使用哈希分區(qū)CREATETABLEsensor_data(timeTIMESTAMPNOTNULL,device_id STRINGNOTNULL,temperatureFLOAT,humidityFLOAT,PRIMARYKEY(time,device_id))PARTITIONBYHASH(device_id);-- 創(chuàng)建分區(qū)CREATETABLEsensor_data_p0PARTITIONOFsensor_dataFORVALUESWITH(MODULUS4,REMAINDER0);CREATETABLEsensor_data_p1PARTITIONOFsensor_dataFORVALUESWITH(MODULUS4,REMAINDER1);CREATETABLEsensor_data_p2PARTITIONOFsensor_dataFORVALUESWITH(MODULUS4,REMAINDER2);CREATETABLEsensor_data_p3PARTITIONOFsensor_dataFORVALUESWITH(MODULUS4,REMAINDER3);7.2 數(shù)據(jù)類型問題問題InfluxDB的float類型在KaiwuDB中映射為DOUBLE解決方案-- 明確指定類型CREATETABLEsensor_data(timeTIMESTAMPNOTNULL,device_id STRINGNOTNULL,temperatureFLOAT,-- 明確使用FLOAThumidityFLOAT);7.3 時(shí)間精度問題問題InfluxDB默認(rèn)使用納秒精度KaiwuDB默認(rèn)使用微秒精度解決方案-- 使用TIMESTAMPTZ保留時(shí)區(qū)信息CREATETABLEsensor_data(timeTIMESTAMPTZNOTNULL,device_id STRINGNOTNULL,temperatureFLOAT,humidityFLOAT);八、總結(jié)InfluxDB到KaiwuDB時(shí)序數(shù)據(jù)模型設(shè)計(jì)改造是遷移成功的關(guān)鍵。核心改造點(diǎn)主標(biāo)簽設(shè)計(jì)選擇高選擇性、穩(wěn)定性、查詢常用的字段普通標(biāo)簽設(shè)計(jì)選擇輔助查詢、低基數(shù)、可變性的字段字段列設(shè)計(jì)選擇數(shù)值型、變化頻繁、有聚合需求的字段表結(jié)構(gòu)設(shè)計(jì)合理分區(qū)降低高基數(shù)影響關(guān)鍵經(jīng)驗(yàn)理解模型差異InfluxDB和KaiwuDB的數(shù)據(jù)模型不同合理設(shè)計(jì)標(biāo)簽主標(biāo)簽和普通標(biāo)簽的選擇很重要處理數(shù)據(jù)類型注意類型映射和精度問題優(yōu)化查詢性能利用KaiwuDB的SQL優(yōu)勢做好數(shù)據(jù)校驗(yàn)確保數(shù)據(jù)一致性如果你正在考慮InfluxDB遷移KaiwuDB建議先做好模型設(shè)計(jì)確保遷移后性能滿足業(yè)務(wù)需求。轉(zhuǎn)載自https://blog.csdn.net/u014727709/article/details/164125627歡迎 點(diǎn)贊?評論?收藏歡迎指正