溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PostgreSQL中的BLOOM INDEX有什么用

發(fā)布時間:2022-01-04 09:48:14 來源:億速云 閱讀:118 作者:柒染 欄目:大數(shù)據(jù)

這篇文章給大家介紹PostgreSQL中的BLOOM INDEX有什么用,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

小編要說的是 bloom 過濾器的問題,但題目為什么是這樣,一般來說我們?nèi)绻o一個大表來加索引,并且這個查詢還要加挺多列的時候,是蠻頭疼的問題,PostgreSQL 中有一種索引叫 BLOOM INDEX ,而這個索引有什么好處,我們來看看。

首先是什么BLOOM ,我看了一些網(wǎng)上的資料,寫的挺好的,里面各種高大上的 X 個 值, K 個HASH , 逼近極限,bula bula ,如果我現(xiàn)在也這樣寫,估計不少人就取關(guān)了。

所以我打算用通俗的話來說說這個事,可能說的不準確的,各位高手給糾正。

例如:我們有一個選秀比賽,里面都是 “小鮮肉”,“小仙女”,而這邊又三個評委, 分別是   柯一敏, 金醒, 馮笑剛 , 這邊先進來一個,李于剛,

柯一敏說,好, 金醒說 好, 馮笑剛說 滾。 

然后我們的評分表上就有了

1     1    0   這個數(shù)字

下面又進來一個 小仙女, 李與春,  柯一敏 說  滾,  金醒說 滾, 馮笑剛說 好

那么我們的評分表上就有了數(shù)字

0   0   1

以此類推,吳以凡 是  101  ,   史巖 是  100 等等, 我們就可以通過這樣的數(shù)字來標識這個人,或者類似的這樣的人。

但有的時候也不盡然,例如進來的是 周深 , 得分和 李于剛 一樣,也是 110

那你說 110 就是 李于剛 就不大對了 (注,得分一樣是因為,他們都嗓門高,唱出的聲音你聽不出是大老爺們)

OK  到此我們的脫離娛樂,回歸到BLOOM 過濾了。某個值通過N 個 hash 計算后,在列表中產(chǎn)生的不同的值,一個值可以有多個HASH 的計算的值來標識,就是BLOOM過濾器的精髓,而通過這樣的方法來查找值,不是 100% 的準確。但如果是用這樣的方法來排除值,那絕對是 100% 的能排除不符合你要查找值的那些數(shù)據(jù)。

我們畫一個圖, 大致的意思我們有一堆值,通過多種HASH 算法,在我們下面的list中生成對應(yīng)的HASH 值,下面的list 是記錄這些值的地方VALUE1 通過三個 不同的HASH 算法后,得到的值是10000001000100100010000001

當然這里面的 位數(shù)為 1 的地方很可能,或者說有很大的可能有重復(fù)的情況,但遇到不同的HASH 算法或者后面的 VALUE2 也要在 已經(jīng)有 1 的地方繼續(xù)寫1的時候,我們就忽略,最后依次將 VALUES  1   2   3   4 這幾個值計算完畢后 10100101010100101010011101

PostgreSQL中的BLOOM INDEX有什么用

那我們得到這個值有什么意義呢,意義就是我們在計算 

value5  6  7  8 得到的值和  10100101010100101010011101 不一樣的情況下,我們可以 100%的肯定,我們的 value 5 6 7 8  和 我們的 value 1 2 3 4 不一樣, 但如果我們在計算 value 5 6 7 8 后,得到的值和 value 1 2 3 4 一樣的情況下,我們是不能 100%的肯定我們的兩次計算的值是相等的。這也就是我們耳熟能詳?shù)呐懦ǎ⑶疫@樣如果想 limit  逼近1 的情況那就可以無限的添加精度更高的 HASH 算法和 能保存值的的長度.

那么這個BLOOM 過濾器使用到使用到索引中,對比其他索引有什么好處?

使用bloom過濾器。當有一個包含太多列的表,并且查詢在這樣的表上使用了太多列的組合時,需要許多索引。維護這么多索引不僅對數(shù)據(jù)庫來說很昂貴,而且在處理較大的數(shù)據(jù)集時也是性能殺手。

如果在所有這些列上創(chuàng)建一個bloom索引,則為每一列計算一個散列,并為每一行/記錄合并到一個指定長度的索引條目中。這樣就可以快速排出不匹配的記錄,如果你查詢的記錄在大表中,占據(jù)的比例是很小或者是唯一的,則是一個好的選擇。

我們下面就看看 PostgreSQL 中的 Bloom index  到底有多少斤兩。

1  我們建立 postgresql的擴展

CREATE EXTENSION bloom;

2  建立一個測試的用表插入數(shù)據(jù) 10000000 行

PostgreSQL中的BLOOM INDEX有什么用

3 給這個表建立一個復(fù)合索引,BTREE 的方式,耗時大約在 31秒

PostgreSQL中的BLOOM INDEX有什么用

4  我們進行一些查詢的測試,可以看到查詢的速度還是蠻快的

PostgreSQL中的BLOOM INDEX有什么用

PostgreSQL中的BLOOM INDEX有什么用

5 我們刪除索引,然后建立bloom 索引整體建立bloom 索引的時間,大約消耗8秒,對比 31秒 那是快了 四分之三

PostgreSQL中的BLOOM INDEX有什么用

6  查詢的速度也是比普通的 BTREE 索引要快的近 不到 10倍的樣子

PostgreSQL中的BLOOM INDEX有什么用

PostgreSQL中的BLOOM INDEX有什么用

那么下面問題來了,你說這么快,那么快,沒有缺點嗎?  

1  Bloom 過濾器適合 多個字段的索引建立

2  Bloom 適合等值運算

關(guān)于PostgreSQL中的BLOOM INDEX有什么用就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI