btree_gist外掛程式提供了一種使用GIST索引結構來類比B樹(B-tree)索引行為的方法。GIST允許使用者為新的資料類型自訂索引策略,常用於處理複雜資料類型(多維資料、地理資訊系統資料)的索引需求,並提供高效的搜尋效能。
功能簡介
btree_gist外掛程式提供了GIST索引操作符類,為基礎資料類型①以及所有枚舉類型實現了等同於B-tree的行為。通常來說,這些操作符的效能不會超過對應的標準B-tree索引效能,而且它們缺少了標準B-tree索引的一個主要功能:強制唯一性。然而,GIST索引操作符也提供了B-tree索引無法提供的一些其他功能。
除了典型的B-tree搜尋操作符,btree_gist還提供了對不等於(<>)的索引支援。不等於索引在具有排除約束的情境中非常有用。
此外,對於有自然距離度量的資料類型,Btree-GIST定義了一個距離操作符<->
,並為使用此操作符的最鄰近搜尋提供了GIST索引支援。僅對部分基礎資料類型②提供了距離操作符。
①:基礎資料類型包含Int2、Int4、Int8、Float4、Float8、Numeric、Timestamp with time zone、Timestamp without time zone、Time with time zone、Time without time zone、Date、Interval、Oid、Money、Char、Varchar、Text、Bytea、Bit、Varbit、Macaddr、Macaddr8、Inet、Cidr、UUID和Bool。
②:部分基礎資料類型包含Int2、Int4、Int8、Float4、Float8、Numeric、Timestamp with time zone、Timestamp without time zone、Time with time zone、Time without time zone、Date、Interval、Oid和Money。
注意事項
btree_gist外掛程式僅支援儲存彈性模式執行個體,並且核心版本必須滿足以下條件:
AnalyticDB PostgreSQL 6.0版執行個體並且版本為v6.6.2.1及以上。
AnalyticDB PostgreSQL 7.0版執行個體並且版本為v7.0.6.1及以上。
安裝外掛程式
請您在AnalyticDB for PostgreSQL執行個體外掛程式管理中安裝btree_gist外掛程式。具體操作,請參見安裝、升級與卸載外掛程式。
GIST索引結構
GIST(Generalized Search Tree)索引是PostgreSQL提供的一種通用索引架構,它允許使用者為複雜的資料類型建立索引。GIST是一種平衡樹結構,可被看作是B-tree和R-tree索引的一個泛化,因而能夠支援多種不同的搜尋策略。
GIST索引的關鍵特性包括:
可擴充性:GIST索引允許開發人員為新的資料類型自訂索引策略。這意味著開發人員不僅能夠為常規資料類型比如整數和字串建立索引,還可以為地理空間資料、全文檢索搜尋、數組和其他更複雜的資料結構建立索引。btree_gist便是基於此特性擴充而來。
支援多種查詢:GIST索引可以支援不同的查詢操作,包括等於、不等於、範圍查詢、最鄰近查詢等。
適用於複雜資料類型:GIST索引特別適合用於複雜資料類型的索引,例如多維資料、地理資訊系統(GIS)資料等,它們通常不適合使用傳統的B-tree索引。
支援高效搜尋和檢索:GIST索引可以極大地加速查詢速度,尤其是在處理複雜資料類型的搜尋和檢索任務時。
然而,GIST索引相比於專用的索引結構(如B-tree)在某些方面可能存在效能上的折中。GIST索引的維護(如插入和刪除操作)可能會比B-tree索引更複雜且效率更低。此外,GIST索引的建立和重建也可能需要較多的時間。因此,請謹慎選擇使用GIST索引。
樣本用法
使用btree_gist代替btree
通過使用btree_gist索引實現對標量的自然距離度量。
例如,使用如下SQL實現尋找距離42最近的10條資料。
CREATE TABLE test (a int4);
-- 建立索引。
CREATE INDEX testidx ON test USING GIST (a);
-- 查詢。
SELECT * FROM test WHERE a < 10;
-- 最鄰近搜尋:找到距離42最近的十條資料。
SELECT *, a <-> 42 AS dist FROM test ORDER BY a <-> 42 LIMIT 10;
排它約束
通過btree_gist索引實現排他約束。
例如,動物園的一個籠子只能包含一種動物。對於123號籠子,當包含了zebra後,允許繼續包含zebra,但不再允許包含lion。而對於新的籠子124,則允許包含lion。
=> CREATE TABLE zoo (
cage INTEGER,
animal TEXT,
EXCLUDE USING GIST (cage WITH =, animal WITH <>)
);
=> INSERT INTO zoo VALUES(123, 'zebra');
INSERT 0 1 --返回結果,表示寫入一行刪除0行。
=> INSERT INTO zoo VALUES(123, 'zebra');
INSERT 0 1
=> INSERT INTO zoo VALUES(123, 'lion');
ERROR: conflicting key value violates exclusion constraint "zoo_cage_animal_excl"
DETAIL: Key (cage, animal)=(123, lion) conflicts with existing key (cage, animal)=(123, zebra).
=> INSERT INTO zoo VALUES(124, 'lion');
INSERT 0 1