技术编程|带你认识PostgreSQL检索神器——Brin Index( 二 )


首先创建一张表并插入数据create table t1 (c1 int, c2 text, c3 text);insert into t1 select i, 'ssfesregeugruehpeoghregygeye', 'frheuogygryeosihfuiewhurheuhre' from generate_series(1, 10000000) i;gpadmin=# \d+List of relationsSchema | Name | Type|Owner| Storage |Size| Description--------+------+-------+---------+---------+--------+------------- public | t1| table | gpadmin | heap| 881 MB |(1 row)
可以看到t1表的大小大约在900MB左右 。
同时在t1上创建Brin索引和Btree索引 。 create index t1_idx_1 on t1 using brin(c1);create index t1_idx_2 on t1 using btree(c1);gpadmin=# \di+List of relationsSchema | Name | Type | Owner | Table | Size | Description--------+----------+-------+---------+-------+--------+-------------public | t1_idx_1 | index | gpadmin | t1| 768 kB |public | t1_idx_2 | index | gpadmin | t1| 213 MB |
可以看到 , Brin索引的大小仅为768KB , 而Btree索引的大小为213MB , 显然在索引大小上 , Brin索引有较大的优势 , 这也是Brin索引最大的一个特点 , 尤其当数据表及其大的时候 , Brin索引的大小优势会显得极其吸引人 。
同时 , Brin索引在查询性能方面也有不错的提升 。
当不使用索引的情况下 , 下面查询耗时4080ms 。 gpadmin=# select count(*) from t1 where c1 > 10 and c1
10 and c1
10 and c1 < 1000;count-------989(1 row)Time: 3.738 ms
考虑到Brin索引是一个范围索引 , 其具有一定的稀疏性 , 索引的精度在一些情况下不如Btree索引 , 上面的性能差距可以理解 。 虽然如此 , 我们也看到Brin索引相对于顺序扫描还是取得了巨大的性能提升 , 这也体现了Brin索引的价值 。 04 结语
Brin索引作为一个新的索引类型 , 具有极具优势的磁盘空间表现以及优秀的查询性能表现 , 同时还具有比较好的索引更新性能 , 这些特性十分符合超大型数据表的要求 , 在现实应用中被大家广泛的使用 , 本文简单介绍了Brin索引及其实现 , 希望对大家理解索引有所帮助 。


推荐阅读