每日全量資料的分割槽表如何優化和儲存
阿新 • • 發佈:2021-07-10
問題
當前業務資料是實時資料,使用者表如下,其中使用者的狀態碼會實時變動 1-正常使用者 2-優先使用者 3-鎖定使用者。 當然比如訂單表狀態 1 已下單 2已支付 3已發貨 等也是類似,此處邏輯是一致的。
當前由於資料分析需要,將每日全量的資料儲存到資料庫中,採用分割槽的方式,分割槽標識是ymd。當 ymd='2020-01-01'
時,則會顯示當前所有的資料。
變動的情況。
實際儲存的方式。
注意到有以下幾個問題:
- 按列來說。變動的只有狀態,姓名、性別等內容也幾乎不會變動,但是每天都需要耗費大量的儲存空間儲存這些冗餘的不變動資訊。
- 按行來講。變動的只有張三的,李四的狀態幾乎不會變動,但是也需要每天同步一份。而當資料庫中80%的歷史資料都是不變動的時候,這種儲存方式將會導致儲存量急劇翻倍。
解決方案
該方案是大資料之路(阿里)中的資料實踐。從上述例子來講,儲存的方式變為這樣。每天變化的情況如下。其中標黃的是當天新增的。
選取資料的時候的正規化是:where start_time<=需求時間 and end_time>需求時間
比如想要選擇1月2日資料(當天張三是2,李四是1的資料)
select *
from 極限儲存表 a
where a.start_time<='1月2日' and a.end_time>'1月2日'
則會選中以下兩條(未被選擇的行是灰色)
這正是我們需求的那一天的資料。
缺陷
這種極限儲存的方式針對於資料基本不變動但偶爾變動的資料效果較好,對於大量歷史資料不變動,最近的少量資料變動效果較好(比如歷史的訂單幾乎不變,最近1周的訂單則比較活躍)。對於需要大量變動的資料,比如遊戲的金幣資料,使用者的積分資料等效果很差。
解決方案是:將劇烈變動的欄位單獨摘出來使用全域性更新,而符合這種儲存方式的表使用這種方式儲存。