postgresql 索引类型
postgresql提供了B-tree,R-tree,GiST和hash索引类型。不同的索引类型适合特定的查询类型。
绝大多数数据库都支持B-tree索引类型,postgresql默认的create index语句也是创建B-tree索引。
R-tree:
R树是一种用于处理多维数据的数据结构,用来访问二维或者更高维区域对象组成的空间数据.R树是一棵平衡树。树上有两类结点:叶子结点和非叶子结点。每一个结点由若干个索引项构成。对于叶子结点,索引项形如(Index,Obj_ID)。其中,Index表示包围空间数据对象的最小外接矩形MBR,Obj_ID标识一个空间数据对象。对于一个非叶子结点,它的索引项形如(Index,Child_Pointer)。 Child_Pointer 指向该结点的子结点。Index仍指一个矩形区域,该矩形区域包围了子结点上所有索引项MBR的最小矩形区域。
postgresql提供了支持空间存储的数据类型:
Name Storage Size Representation Description
point 16 bytes Point on the plane (x,y)
line 32 bytes Infinite line (not fully implemented) ((x1,y1),(x2,y2))
lseg 32 bytes Finite line segment ((x1,y1),(x2,y2))
box 32 bytes Rectangular box ((x1,y1),(x2,y2))
path 16+16n bytes Closed path (similar to polygon) ((x1,y1),...)
path 16+16n bytes Open path [(x1,y1),...]
polygon 40+16n bytes Polygon (similar to closed path) ((x1,y1),...)
circle 24 bytes Circle <(x,y),r> (center and radius)
参考文档:http://www.postgresql.org/docs/8.3/static/datatype-geometric.html
在这些数据类型的列上可以创建R-tree类型的索引。举例说明:
wyz=# CREATE TABLE abc (shape polygon);
CREATE
wyz=# CREATE INDEX spacial_idx ON abc USING RTREE (shape);
CREATE
相对R-tree做深一步了解可以看以下Guttman的《R-Trees - A Dynamic Index Structure for Spatial Searching》。
Hash
查看文档说hash类型的索引常用于进行"="操作的数据列。其中也著名hash类型索引相对B-tree类型的索引不管是存储还是性能都比较差,不建议使用hash类型索引。
创建hash类型索引的过程实质是对数据进行hash函数操作,然后存储hash值。从hash函数原理的角度去考虑就能很快发现hash类型索引的劣势在哪了。对在一个OLTP的数据库中采用hash类型索引的表进行DML操作时,不仅增大CPU的开销,也没有节省存储的消耗。
GiST
通用搜索树(Generalized Search Tree),与其说是一种索引类型,不如说是建立索引的平台或者模板。利用Gist可以建立B-tree,R-tree或者其他的类型索引。
对GiST感兴趣可以参考GiST的项目网站http://gist.cs.berkeley.edu/
postgresql的索引创建语法:
CREATE [ UNIQUE ] INDEX indexname ON table
[ USING indextype ] ( functionname ( column [, ...] ) [ opclass ] )