天天看點

多階魔方複原在資料優化中的應用

postgresql , 元素分布 , 減少heap io , 資料聚集重組

前一篇文章介紹了一個場景,利用多列索引,多種索引接口(gin\btree\brin...)以及postgresql内置的bitmapand, bitmapor等手段,提升廣告營銷實時搜尋性能,同時兼顧開發工作量。

<a href="https://github.com/digoal/blog/blob/master/201706/20170612_04.md">《懶人推動社會進步 - 多列聚合, gin與資料分布(選擇性)》</a>

其中在講到gin索引的優化時,留了一個懸念,到底如何通過調整資料分布,降低gin索引掃描的io放大,提高掃描效率?

聚集有什麼用呢?如何聚集呢?

例子

假設有6條記錄,每條記錄存儲了一些value(數組),6條記錄友善示範。

多階魔方複原在資料優化中的應用

圖形化如下

多階魔方複原在資料優化中的應用

當搜尋包含2的資料時,需要掃描第1,2條記錄。

當搜尋包含1的資料時,需要掃描第1,3,5條記錄。(1,3,5離散分布,即現實中包含1的資料,很可能在不同資料塊中,那麼需要掃描更多的資料塊)。

接下來做一個簡單的存儲調整,将資料進行重排。

多階魔方複原在資料優化中的應用
多階魔方複原在資料優化中的應用

很顯然,現在沒有離散的資料了,對同一個元素來說,更加的緊密相連,例如搜尋包含1的資料時,他們是相鄰的記錄(現實中極有可能在同一個資料塊中)。

說到資料重分布,就涉及到聚集的問題了,如何讓同一個元素,盡量的靠在一起呢?

你需要了解一些資料科學計算的知識,可以參考一下:

<a href="https://github.com/digoal/blog/blob/master/201705/20170526_01.md">《資料庫任督二脈 - 資料與計算的生态融合》</a>

真實情況下,幾乎不可能做到每一個元素的行都是緊密相鄰的,就像玩“不可複原的(有bug的)”多階魔方。你怎麼轉,都不可能做到面面俱到。

多階魔方複原在資料優化中的應用

我們隻能通過科學計算,盡可能的找到最終态較好的資料分布狀态。