這篇文章給大家介紹PostgreSQL中的BLOOM INDEX有什么用,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
為企業(yè)提供成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、網(wǎng)站優(yōu)化、成都全網(wǎng)營(yíng)銷(xiāo)推廣、競(jìng)價(jià)托管、品牌運(yùn)營(yíng)等營(yíng)銷(xiāo)獲客服務(wù)。成都創(chuàng)新互聯(lián)公司擁有網(wǎng)絡(luò)營(yíng)銷(xiāo)運(yùn)營(yíng)團(tuán)隊(duì),以豐富的互聯(lián)網(wǎng)營(yíng)銷(xiāo)經(jīng)驗(yàn)助力企業(yè)精準(zhǔn)獲客,真正落地解決中小企業(yè)營(yíng)銷(xiāo)獲客難題,做到“讓獲客更簡(jiǎn)單”。自創(chuàng)立至今,成功用技術(shù)實(shí)力解決了企業(yè)“網(wǎng)站建設(shè)、網(wǎng)絡(luò)品牌塑造、網(wǎng)絡(luò)營(yíng)銷(xiāo)”三大難題,同時(shí)降低了營(yíng)銷(xiāo)成本,提高了有效客戶(hù)轉(zhuǎn)化率,獲得了眾多企業(yè)客戶(hù)的高度認(rèn)可!
小編要說(shuō)的是 bloom 過(guò)濾器的問(wèn)題,但題目為什么是這樣,一般來(lái)說(shuō)我們?nèi)绻o一個(gè)大表來(lái)加索引,并且這個(gè)查詢(xún)還要加挺多列的時(shí)候,是蠻頭疼的問(wèn)題,PostgreSQL 中有一種索引叫 BLOOM INDEX ,而這個(gè)索引有什么好處,我們來(lái)看看。
首先是什么BLOOM ,我看了一些網(wǎng)上的資料,寫(xiě)的挺好的,里面各種高大上的 X 個(gè) 值, K 個(gè)HASH , 逼近極限,bula bula ,如果我現(xiàn)在也這樣寫(xiě),估計(jì)不少人就取關(guān)了。
所以我打算用通俗的話來(lái)說(shuō)說(shuō)這個(gè)事,可能說(shuō)的不準(zhǔn)確的,各位高手給糾正。
例如:我們有一個(gè)選秀比賽,里面都是 “小鮮肉”,“小仙女”,而這邊又三個(gè)評(píng)委, 分別是 柯一敏, 金醒, 馮笑剛 , 這邊先進(jìn)來(lái)一個(gè),李于剛,
柯一敏說(shuō),好, 金醒說(shuō) 好, 馮笑剛說(shuō) 滾。
然后我們的評(píng)分表上就有了
1 1 0 這個(gè)數(shù)字
下面又進(jìn)來(lái)一個(gè) 小仙女, 李與春, 柯一敏 說(shuō) 滾, 金醒說(shuō) 滾, 馮笑剛說(shuō) 好
那么我們的評(píng)分表上就有了數(shù)字
0 0 1
以此類(lèi)推,吳以凡 是 101 , 史巖 是 100 等等, 我們就可以通過(guò)這樣的數(shù)字來(lái)標(biāo)識(shí)這個(gè)人,或者類(lèi)似的這樣的人。
但有的時(shí)候也不盡然,例如進(jìn)來(lái)的是 周深 , 得分和 李于剛 一樣,也是 110
那你說(shuō) 110 就是 李于剛 就不大對(duì)了 (注,得分一樣是因?yàn)?,他們都嗓門(mén)高,唱出的聲音你聽(tīng)不出是大老爺們)
OK 到此我們的脫離娛樂(lè),回歸到BLOOM 過(guò)濾了。某個(gè)值通過(guò)N 個(gè) hash 計(jì)算后,在列表中產(chǎn)生的不同的值,一個(gè)值可以有多個(gè)HASH 的計(jì)算的值來(lái)標(biāo)識(shí),就是BLOOM過(guò)濾器的精髓,而通過(guò)這樣的方法來(lái)查找值,不是 100% 的準(zhǔn)確。但如果是用這樣的方法來(lái)排除值,那絕對(duì)是 100% 的能排除不符合你要查找值的那些數(shù)據(jù)。
我們畫(huà)一個(gè)圖, 大致的意思我們有一堆值,通過(guò)多種HASH 算法,在我們下面的list中生成對(duì)應(yīng)的HASH 值,下面的list 是記錄這些值的地方VALUE1 通過(guò)三個(gè) 不同的HASH 算法后,得到的值是10000001000100100010000001
當(dāng)然這里面的 位數(shù)為 1 的地方很可能,或者說(shuō)有很大的可能有重復(fù)的情況,但遇到不同的HASH 算法或者后面的 VALUE2 也要在 已經(jīng)有 1 的地方繼續(xù)寫(xiě)1的時(shí)候,我們就忽略,最后依次將 VALUES 1 2 3 4 這幾個(gè)值計(jì)算完畢后 10100101010100101010011101
那我們得到這個(gè)值有什么意義呢,意義就是我們?cè)谟?jì)算
value5 6 7 8 得到的值和 10100101010100101010011101 不一樣的情況下,我們可以 100%的肯定,我們的 value 5 6 7 8 和 我們的 value 1 2 3 4 不一樣, 但如果我們?cè)谟?jì)算 value 5 6 7 8 后,得到的值和 value 1 2 3 4 一樣的情況下,我們是不能 100%的肯定我們的兩次計(jì)算的值是相等的。這也就是我們耳熟能詳?shù)呐懦?,并且這樣如果想 limit 逼近1 的情況那就可以無(wú)限的添加精度更高的 HASH 算法和 能保存值的的長(zhǎng)度.
那么這個(gè)BLOOM 過(guò)濾器使用到使用到索引中,對(duì)比其他索引有什么好處?
使用bloom過(guò)濾器。當(dāng)有一個(gè)包含太多列的表,并且查詢(xún)?cè)谶@樣的表上使用了太多列的組合時(shí),需要許多索引。維護(hù)這么多索引不僅對(duì)數(shù)據(jù)庫(kù)來(lái)說(shuō)很昂貴,而且在處理較大的數(shù)據(jù)集時(shí)也是性能殺手。
如果在所有這些列上創(chuàng)建一個(gè)bloom索引,則為每一列計(jì)算一個(gè)散列,并為每一行/記錄合并到一個(gè)指定長(zhǎng)度的索引條目中。這樣就可以快速排出不匹配的記錄,如果你查詢(xún)的記錄在大表中,占據(jù)的比例是很小或者是唯一的,則是一個(gè)好的選擇。
我們下面就看看 PostgreSQL 中的 Bloom index 到底有多少斤兩。
1 我們建立 postgresql的擴(kuò)展
CREATE EXTENSION bloom;
2 建立一個(gè)測(cè)試的用表插入數(shù)據(jù) 10000000 行
3 給這個(gè)表建立一個(gè)復(fù)合索引,BTREE 的方式,耗時(shí)大約在 31秒
4 我們進(jìn)行一些查詢(xún)的測(cè)試,可以看到查詢(xún)的速度還是蠻快的
5 我們刪除索引,然后建立bloom 索引整體建立bloom 索引的時(shí)間,大約消耗8秒,對(duì)比 31秒 那是快了 四分之三
6 查詢(xún)的速度也是比普通的 BTREE 索引要快的近 不到 10倍的樣子
那么下面問(wèn)題來(lái)了,你說(shuō)這么快,那么快,沒(méi)有缺點(diǎn)嗎?
1 Bloom 過(guò)濾器適合 多個(gè)字段的索引建立
2 Bloom 適合等值運(yùn)算
關(guān)于PostgreSQL中的BLOOM INDEX有什么用就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
本文名稱(chēng):PostgreSQL中的BLOOMINDEX有什么用
瀏覽地址:http://chinadenli.net/article30/giojso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、移動(dòng)網(wǎng)站建設(shè)、外貿(mào)建站、企業(yè)建站、靜態(tài)網(wǎng)站、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容