使用關係型數據庫分塊處理幾億幾十億條數據

分塊計算是將數據按一定的規則切割成若干份,然後分別計算,再將結果合併彙總得到最終結果。
 
經常統計時會涉及到一次要對幾千萬甚至幾十億的數據進行聚合計算 ( 或表關聯 ) ,因爲硬件本身的限制(特別是沒有足夠大的內存和臨時表空間),往往顯得無能爲力。這時如果不人爲去將數據進行分割計算(或關聯),系統將會陷入異常緩慢的計算過程甚至因臨時表空間不足而崩潰。
 
分塊計算最重要的是找到一個字段作爲分割數據的依據,使得計算結果裏不包含重複累加的值。以渠道統計爲例,最初我們按軟件對4取模,平臺對2取模的方式,將數據分成8張表。如下圖:



這種分割在剛開始時確實效果比較明顯,但隨着數據量的增加(軟件的用戶量不同),不同表間的數據量差異越來越大,有的表數據量很大,有的又很少,大表在關聯更新數據時就顯得很慢。下面是關聯更新的日誌(softIdMod=0,platformMod=0即爲Sjqd_Users_S0_P0表):


 
後面我們改用 IMEI 作爲分割依據(只要將相同 IMEI 的數據分在同一個分塊裏就不會出現重複統計的問題),將分表改爲分區,原本想用 IMEI 後兩位作爲分區列,但結果數據分佈也不是很均勻。目前的作法是先求出 IMEI Hash Code 值,然後再對 128 取模,將得到的值作爲分區列,從下圖可以看出分佈非常的均勻(這是其中幾個分區,第一列是分區列值,每二列爲對應的行數):



注:改進後的分區方案也可作爲分服務器併發計算的基礎,同時也可作爲抽樣統計的依據。