一童漩、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
- 原理
varbitx是阿里云RDS的擴(kuò)展包,豐富bit類型的函數(shù)接口叮阅,實(shí)際上并不是索引接口刁品,但是在PostgreSQL中使用varbitx可以代替bitmap索引,達(dá)到同樣的效果浩姥。 - 應(yīng)用場(chǎng)景
《基于 阿里云 RDS PostgreSQL 打造實(shí)時(shí)用戶畫像推薦系統(tǒng)》
十二哑诊、部分索引
- 應(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)容。