PostgreSQL 14種索引的原理和應(yīng)用場(chǎng)景

一童漩、btree
  • 原理
    《深入淺出PostgreSQL B-Tree索引結(jié)構(gòu)》
  • 應(yīng)用場(chǎng)景
    b-tree適合所有的數(shù)據(jù)類型苛让,支持排序沟蔑,支持大于、小于狱杰、等于瘦材、大于或等于、小于或等于的搜索仿畸。
    索引與遞歸查詢結(jié)合食棕,還能實(shí)現(xiàn)快速的稀疏檢索。
二、hash
  • 原理
    src/backend/access/hash/README
    (hash index entries store only the hash code, not the actual data value, for each indexed item. )
  • 應(yīng)用場(chǎng)景
    hash索引存儲(chǔ)的是被索引字段VALUE的哈希值宣蠕,只支持等值查詢。
    hash索引特別適用于字段VALUE非常長(zhǎng)(不適合b-tree索引甥捺,因?yàn)閎-tree一個(gè)PAGE至少要存儲(chǔ)3個(gè)ENTRY抢蚀,所以不支持特別長(zhǎng)的VALUE)的場(chǎng)景,例如很長(zhǎng)的字符串镰禾,并且用戶只需要等值搜索皿曲,建議使用hash index
三、gin
  • 原理
    gin是倒排索引吴侦,存儲(chǔ)被索引字段的VALUE或VALUE的元素屋休,以及行號(hào)的list或tree。
  • 應(yīng)用場(chǎng)景
    1备韧、當(dāng)需要搜索多值類型內(nèi)的VALUE時(shí)劫樟,適合多值類型,例如數(shù)組织堂、全文檢索叠艳、TOKEN。(根據(jù)不同的類型易阳,支持相交附较、包含、大于潦俺、在左邊拒课、在右邊等搜索)
    2、當(dāng)用戶的數(shù)據(jù)比較稀疏時(shí)事示,如果要搜索某個(gè)VALUE的值早像,可以適應(yīng)btree_gin支持普通btree支持的類型。(支持btree的操作符)
    3很魂、當(dāng)用戶需要按任意列進(jìn)行搜索時(shí)扎酷,gin支持多列展開單獨(dú)建立索引域,同時(shí)支持內(nèi)部多域索引的bitmapAnd, bitmapOr合并遏匆,快速的返回按任意列搜索請(qǐng)求的數(shù)據(jù)法挨。
四、gist
  • 原理
    GiST stands for Generalized Search Tree.
    It is a balanced, tree-structured access method, that acts as a base template in which to implement arbitrary indexing schemes.
    B-trees, R-trees and many other indexing schemes can be implemented in GiST.
  • 應(yīng)用場(chǎng)景
    GiST是一個(gè)通用的索引接口幅聘,可以使用GiST實(shí)現(xiàn)b-tree, r-tree等索引結(jié)構(gòu)凡纳。
    不同的類型,支持的索引檢索也各不一樣帝蒿。例如:
    1荐糜、幾何類型,支持位置搜索(包含、相交暴氏、在上下左右等)延塑,按距離排序。
    2答渔、范圍類型关带,支持位置搜索(包含、相交沼撕、在左右等)宋雏。
    3、IP類型务豺,支持位置搜索(包含磨总、相交、在左右等)笼沥。
    4蚪燕、空間類型(PostGIS),支持位置搜索(包含敬拓、相交邻薯、在上下左右等),按距離排序乘凸。
    5厕诡、標(biāo)量類型,支持按距離排序营勤。
五灵嫌、sp-gist
  • 原理
    SP-GiST類似GiST,是一個(gè)通用的索引接口葛作,但是SP-GIST使用了空間分區(qū)的方法寿羞,使得SP-GiST可以更好的支持非平衡數(shù)據(jù)結(jié)構(gòu),例如quad-trees, k-d tree, radis tree.
  • 應(yīng)用場(chǎng)景
    1赂蠢、幾何類型绪穆,支持位置搜索(包含、相交虱岂、在上下左右等)玖院,按距離排序。
    2第岖、范圍類型难菌,支持位置搜索(包含、相交蔑滓、在左右等)郊酒。
    3遇绞、IP類型,支持位置搜索(包含燎窘、相交摹闽、在左右等)。
六褐健、brin
  • 原理
    BRIN 索引是塊級(jí)索引钩骇,有別于B-TREE等索引,BRIN記錄并不是以行號(hào)為單位記錄索引明細(xì)铝量,而是記錄每個(gè)數(shù)據(jù)塊或者每段連續(xù)的數(shù)據(jù)塊的統(tǒng)計(jì)信息。因此BRIN索引空間占用特別的小银亲,對(duì)數(shù)據(jù)寫入慢叨、更新、刪除的影響也很小务蝠。
    BRIN屬于LOSSLY索引拍谐,當(dāng)被索引列的值與物理存儲(chǔ)相關(guān)性很強(qiáng)時(shí),BRIN索引的效果非常的好馏段。
    例如時(shí)序數(shù)據(jù)轩拨,在時(shí)間或序列字段創(chuàng)建BRIN索引,進(jìn)行等值院喜、范圍查詢時(shí)效果很棒亡蓉。
  • 應(yīng)用場(chǎng)景
    《PostgreSQL 聚集存儲(chǔ) 與 BRIN索引 - 高并發(fā)行為、軌跡類大吞吐數(shù)據(jù)查詢場(chǎng)景解說(shuō)》
七喷舀、rum
  • 原理
    https://github.com/postgrespro/rum
    rum 是一個(gè)索引插件砍濒,由Postgrespro開源,適合全文檢索硫麻,屬于GIN的增強(qiáng)版本爸邢。
    增強(qiáng)包括:
    1、在RUM索引中拿愧,存儲(chǔ)了lexem的位置信息杠河,所以在計(jì)算ranking時(shí),不需要回表查詢(而GIN需要回表查詢)浇辜。
    2券敌、RUM支持phrase搜索,而GIN無(wú)法支持奢赂。
    3陪白、在一個(gè)RUM索引中,允許用戶在posting tree中存儲(chǔ)除ctid(行號(hào))以外的字段VALUE膳灶,例如時(shí)間戳咱士。
    這使得RUM不僅支持GIN支持的全文檢索立由,還支持計(jì)算文本的相似度值,按相似度排序等序厉。同時(shí)支持位置匹配锐膜,例如(速度與激情,可以采用"速度" <2> "激情" 進(jìn)行匹配弛房,而GIN索引則無(wú)法做到)
  • 應(yīng)用場(chǎng)景
    《PostgreSQL 全文檢索加速 快到?jīng)]有朋友 - RUM索引接口(潘多拉魔盒)》
八道盏、bloom
  • 原理
    bloom索引接口是PostgreSQL基于bloom filter構(gòu)造的一個(gè)索引接口,屬于lossy索引文捶,可以收斂結(jié)果集(排除絕對(duì)不滿足條件的結(jié)果荷逞,剩余的結(jié)果里再挑選滿足條件的結(jié)果),因此需要二次check粹排,bloom支持任意列組合的等值查詢种远。
    bloom存儲(chǔ)的是簽名,簽名越大顽耳,耗費(fèi)的空間越多坠敷,但是排除更加精準(zhǔn)。有利有弊射富。
  • 應(yīng)用場(chǎng)景
    bloom索引適合多列任意組合查詢
    《PostgreSQL 9.6 黑科技 bloom 算法索引膝迎,一個(gè)索引支撐任意列組合查詢》
九、zombodb
  • 原理
    zombodb是PostgreSQL與ElasticSearch結(jié)合的一個(gè)索引接口胰耗,可以直接讀寫ES限次。
    https://github.com/zombodb/zombodb
  • 應(yīng)用場(chǎng)景
    與ES結(jié)合,實(shí)現(xiàn)SQL接口的搜索引擎柴灯,實(shí)現(xiàn)數(shù)據(jù)的透明搜索掂恕。
十、bitmap
  • 原理
    bitmap索引是Greenplum的索引接口弛槐,類似GIN倒排懊亡,只是bitmap的KEY是列的值,VALUE是BIT(每個(gè)BIT對(duì)應(yīng)一行)乎串,而不是行號(hào)list或tree店枣。
    《Greenplum 最佳實(shí)踐 - 什么時(shí)候選擇bitmap索引》
  • 應(yīng)用場(chǎng)景
    當(dāng)某個(gè)字段的唯一值個(gè)數(shù)在100到10萬(wàn)之間(超出這個(gè)范圍,不建議使用bitmap)時(shí)叹誉,如果表的記錄數(shù)特別多鸯两,而且變更不頻繁(或者是AO表),那么很適合BITMAP索引长豁,bitmap索引可以實(shí)現(xiàn)快速的多個(gè)或單個(gè)VALUE的搜索钧唐。因?yàn)橹恍枰獙?duì)行號(hào)的BITMAP進(jìn)行BIT與或運(yùn)算,得到最終的BITMAP匠襟,從最終的BITMAP映射到行進(jìn)行提取钝侠。
    bitmap與btree一樣该园,都支持 等于,大于帅韧,小于里初,大于等于,小于等于的查詢忽舟。
十一双妨、varbitx
十二哑诊、部分索引
  • 應(yīng)用場(chǎng)景
    PostgreSQL允許用戶創(chuàng)建部分索引,例如業(yè)務(wù)上只關(guān)心激活用戶及刻,所以可以只對(duì)激活用戶創(chuàng)建索引。
十三竞阐、表達(dá)式索引
  • 應(yīng)用場(chǎng)景
    表達(dá)式索引也是PostgreSQL特有的特性缴饭,例如用戶的數(shù)據(jù)需要轉(zhuǎn)換后查詢,例如某些設(shè)備上傳的地理坐標(biāo)的坐標(biāo)系不符合國(guó)標(biāo)骆莹,需要轉(zhuǎn)換為國(guó)內(nèi)的空間坐標(biāo)來(lái)查詢颗搂。
    那么可以針對(duì)這類字段,創(chuàng)建表達(dá)式索引幕垦,將轉(zhuǎn)換過(guò)程放到表達(dá)式中丢氢,查詢時(shí)也使用表達(dá)式進(jìn)行查詢。
十四先改、內(nèi)部窺視索引存儲(chǔ)
  • 應(yīng)用場(chǎng)景
    通過(guò)pageinspect插件疚察,可以讀取索引頁(yè)的內(nèi)容。
參考文獻(xiàn)
  1. PostgreSQL 9種索引的原理和應(yīng)用場(chǎng)景
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仇奶,一起剝皮案震驚了整個(gè)濱河市貌嫡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌该溯,老刑警劉巖岛抄,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異狈茉,居然都是意外死亡夫椭,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門氯庆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蹭秋,“玉大人扰付,你說(shuō)我怎么就攤上這事「蟹铮” “怎么了悯周?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)陪竿。 經(jīng)常有香客問(wèn)我禽翼,道長(zhǎng),這世上最難降的妖魔是什么族跛? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任闰挡,我火速辦了婚禮,結(jié)果婚禮上礁哄,老公的妹妹穿的比我還像新娘长酗。我一直安慰自己,他們只是感情好桐绒,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布夺脾。 她就那樣靜靜地躺著,像睡著了一般茉继。 火紅的嫁衣襯著肌膚如雪咧叭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天烁竭,我揣著相機(jī)與錄音菲茬,去河邊找鬼。 笑死派撕,一個(gè)胖子當(dāng)著我的面吹牛婉弹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播终吼,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼镀赌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了际跪?” 一聲冷哼從身側(cè)響起佩脊,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎垫卤,沒(méi)想到半個(gè)月后威彰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡穴肘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年歇盼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片评抚。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡豹缀,死狀恐怖伯复,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情邢笙,我是刑警寧澤啸如,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站氮惯,受9級(jí)特大地震影響叮雳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜妇汗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一帘不、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧杨箭,春花似錦寞焙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至慈参,卻和暖如春呛牲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背懂牧。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尊勿,地道東北人僧凤。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像元扔,于是被迫代替她去往敵國(guó)和親躯保。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容