PostgreSQL树状存储——ltree

ltree是pg内置的一个插件,实现了一种数据类型ltree用于表示存储在一个层次树状结构中的数据的标签。还提 供了在标签树中搜索的扩展功能。

使用方法:
1、安装extension,需要超级用户

bill@bill=> create extension ltree;  
CREATE EXTENSION  

2、支持的数据类型
ltree (目前只支持A-Z,a-z,0-9,_作为label的合法字符)
树形结构类型,一个ltree被称为一个path,由1或多个LABEL组成,每个label由A-Z,a-z,0-9,_组成。

lquery
规则表达式,用于匹配ltree类型。需要注意的是%匹配的不是一个label,而是label里的一个单词(_为单词分隔符)

ltxtquery
一般用于全文扫描,注意,只有ltxtquery类型是符号和匹配的内容是可以有空格隔开的,lquery和ltree不支持空格。

3、实例
–建表

bill@bill=>CREATE TABLE ltreetest (t ltree);
CREATE TABLE
bill@bill=>copy ltreetest from '/home/pg12/postgresql-12beta4/contrib/ltree/data/ltree.data';
COPY 1006
bill@bill=> select * from ltreetest limit 10;
     t     
-----------
 
 1
 1.1
 1.1.1
 1.1.1.1
 1.1.1.2
 1.1.1.2.1
 1.1.2
 1.1.2.1
 1.1.3
(10 rows)

–查询

bill@bill=>explain SELECT * FROM ltreetest WHERE t <  '12.3' order by t asc;
                           QUERY PLAN                            
-----------------------------------------------------------------
 Sort  (cost=23.59..23.59 rows=1 width=57)
   Sort Key: t
   ->  Seq Scan on ltreetest  (cost=0.00..23.58 rows=1 width=57)
         Filter: (t < '12.3'::ltree)
(4 rows)

–查询’1.1.2.2’的祖先数据

bill@bill=> select * from ltreetest where t @> '1.1.2.2';
   t   
-------
 
 1
 1.1
 1.1.2
(4 rows)

–创建btree索引

bill@bill=>create unique index tstidx on ltreetest (t);
CREATE INDEX
bill@bill=>analyze ltreetest ;
ANALYZE
bill@bill=>explain SELECT * FROM ltreetest WHERE t <  '12.3' order by t asc;
                                  QUERY PLAN                                  
------------------------------------------------------------------------------
 Index Only Scan using tstidx on ltreetest  (cost=0.28..2.89 rows=1 width=57)
   Index Cond: (t < '12.3'::ltree)
(2 rows)

–创建gist索引

bill@bill=>drop index tstidx;
DROP INDEX
bill@bill=>create index tstidx on ltreetest using gist (t);
CREATE INDEX
bill@bill=>analyze ltreetest ;
ANALYZE
bill@bill=>explain SELECT * FROM ltreetest WHERE t <  '12.3' order by t asc;
                                  QUERY PLAN                                   
-------------------------------------------------------------------------------
 Sort  (cost=2.77..2.77 rows=1 width=57)
   Sort Key: t
   ->  Index Scan using tstidx on ltreetest  (cost=0.14..2.76 rows=1 width=57)
         Index Cond: (t < '12.3'::ltree)
(4 rows)

参考资料:
https://www.postgresql.org/docs/13/ltree.html

你可能感兴趣的:(PostgreSQL)