摘要: 标签 PostgreSQL , btree , hash , gin , gist , sp-gist , brin , bloom , rum , zombodb , bitmap 背景 PostgreSQL 拥有众多开放特性,例如 1、开放的数据类型接口,使得PG支持超级丰富的数据类型,除了传统数据库支持的类型,还支持GIS,JSON,RANGE,IP,ISBN,图像特征值,化学,DNA等等扩展的类型,用户还可以根据实际业务扩展更多的类型。
标签
PostgreSQL , btree , hash , gin , gist , sp-gist , brin , bloom , rum , zombodb , bitmap
背景
PostgreSQL 拥有众多开放特性,例如
1、开放的数据类型接口,使得PG支持超级丰富的数据类型,除了传统数据库支持的类型,还支持GIS,JSON,RANGE,IP,ISBN,图像特征值,化学,DNA等等扩展的类型,用户还可以根据实际业务扩展更多的类型。
2、开放的操作符接口,使得PG不仅仅支持常见的类型操作符,还支持扩展的操作符,例如 距离符,逻辑并、交、差符号,图像相似符号,几何计算符号等等扩展的符号,用户还可以根据实际业务扩展更多的操作符。
3、开放的外部数据源接口,使得PG支持丰富的外部数据源,例如可以通过FDW读写MySQL, redis, mongo, oracle, sqlserver, hive, www, hbase, ldap, 等等只要你能想到的数据源都可以通过FDW接口读写。
4、开放的语言接口,使得PG支持几乎地球上所有的编程语言作为数据库的函数、存储过程语言,例如plpython , plperl , pljava , plR , plCUDA , plshell等等。用户可以通过language handler扩展PG的语言支持。
5、开放的索引接口,使得PG支持非常丰富的索引方法,例如btree , hash , gin , gist , sp-gist , brin , bloom , rum , zombodb , bitmap (greenplum extend),用户可以根据不同的数据类型,以及查询的场景,选择不同的索引。
6、PG内部还支持BitmapAnd, BitmapOr的优化方法,可以合并多个索引的扫描操作,从而提升多个索引数据访问的效率。
不同的索引接口针对的数据类型、业务场景是不一样的,接下来针对每一种索引,介绍一下它的原理和应用场景。
一、btree
原理
应用场景
b-tree适合所有的数据类型,支持排序,支持大于、小于、等于、大于或等于、小于或等于的搜索。
索引与递归查询结合,还能实现快速的稀疏检索。
《PostgrSQL 递归SQL的几个应用 - 极客与正常人的思维》
例子
postgres=# create table t_btree(id int, info text);
CREATE TABLE
postgres=# insert into t_btree select generate_series(1,10000), md5(random()::text) ;
INSERT 0 10000
postgres=# create index idx_t_btree_1 on t_btree using btree (id);
CREATE INDEX
postgres=# explain (analyze,verbose,timing,costs,buffers) select * from t_btree where id=1;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------
Index Scan using idx_t_btree_1 on public.t_btree (cost=0.29..3.30 rows=1 width=37) (actual time=0.027..0.027 rows=1 loops=1)
Output: id, info
Index Cond: (t_btree.id = 1)
Buffers: shared hit=1 read=2
Planning time: 0.292 ms
Execution time: 0.050 ms
(6 rows)
二、hash
原理
src/backend/access/hash/README
(hash index entries store only the hash code, not the actual data value, for each indexed item. )
应用场景
hash索引存储的是被索引字段VALUE的哈希值,只支持等值查询。
hash索引特别适用于字段VALUE非常长(不适合b-tree索引,因为b-tree一个PAGE至少要存储3个ENTRY,所以不支持特别长的VALUE)的场景,例如很长的字符串,并且用户只需要等值搜索,建议使用hash index。
例子
postgres=# create table t_hash (id int, info text);
CREATE TABLE
postgres=# insert into t_hash select generate_series(1,100), repeat(md5(random()::text),10000);
INSERT 0 100
-- 使用b-tree索引会报错,因为长度超过了1/3的索引页大小
postgres=# create index idx_t_hash_1 on t_hash using btree (info);
ERROR: index row size 3720 exceeds maximum 2712 for index "idx_t_hash_1"
HINT: Values larger than 1/3 of a buffer page cannot be indexed.
Consider a function index of an MD5 hash of the value, or use full text indexing.
postgres=# create index idx_t_hash_1 on t_hash using hash (info);
CREATE INDEX
postgres=# set enable_hashjoin=off;
SET
postgres=# explain (analyze,verbose,timing,costs,buffers) select * from t_hash where info in (select info from t_hash limit 1);
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------
Nested Loop (cost=0.03..3.07 rows=1 width=22) (actual time=0.859..0.861 rows=1 loops=1)
Output: t_hash.id, t_hash.info
Buffers: shared hit=11
-> HashAggregate (cost=0.03..0.04 rows=1 width=18) (actual time=0.281..0.281 rows=1 loops=1)
Output: t_hash_1.info
Group Key: t_hash_1.info
Buffers: shared hit=3
-> Limit (cost=0.00..0.02 rows=1 width=18) (actual time=0.012..0.012 rows=1 loops=1)
Output: t_hash_1.info
Buffers: shared hit=1
-> Seq Scan on public.t_hash t_hash_1 (cost=0.00..2.00 rows=100 width=18) (actual time=0.011..0.011 rows=1 loops=1)
Output: t_hash_1.info
Buffers: shared hit=1
-> Index Scan using idx_t_hash_1 on public.t_hash (cost=0.00..3.02 rows=1 width=22) (actual time=0.526..0.527 rows=1 loops=1)
Output: t_hash.id, t_hash.info
Index Cond: (t_hash.info = t_hash_1.info)
Buffers: shared hit=6
Planning time: 0.159 ms
Execution time: 0.898 ms
相关推荐
在关系型数据库中,全文索引通常基于倒排索引原理实现,能够显著提高搜索效率。 2. **中文分词技术**:由于中文不同于英文等西方语言,不具备明显的词语边界,因此在处理中文文本时需要采用专门的分词技术。中文...
- PostgreSQL拥有丰富的内置数据类型和函数,源码中可能包含各种数据类型的应用场景,以及自定义函数的创建和使用。 8. **存储过程和触发器**: - 学习如何编写和管理存储过程和触发器,可以提高代码复用性和...
- 子查询和联接查询的应用场景分析。 - 分区表的创建与管理方法。 - JSON数据类型支持及其操作指令。 - 触发器和存储过程编写示例。 6. **集群管理** - 主从复制模型搭建步骤。 - 流复制和逻辑复制的区别及...
在特定的应用场景下,结合内核扩展带来的灵活性和性能提升,可以极大地增强PostgreSQL数据库的实用性和业务价值。 上述内容总结了PostgreSQL内核扩展入门的基本知识点,包括PostgreSQL的整体流程、性能分析方法、...
9. **高性能索引**:除了B-Tree索引,PostgreSQL还支持GiST、SP-GiST、GIN和BRIN等多种索引类型,选择合适的索引类型对于优化查询性能至关重要。 10. **扩展与插件**:PostgreSQL拥有丰富的扩展库,如哈希函数、...
此外,它还支持多种存储引擎和查询优化策略,能够根据不同的应用场景进行定制化的调优。 ### 结论 《PostgreSQL介绍与概念》一书详细介绍了PostgreSQL的发展历程、核心概念和技术特点,是学习和掌握PostgreSQL知识...
### PostgreSQL 9 Administration Cookbook Second Edition 知识点详解 #### 一、书籍基本信息...它不仅覆盖了 PostgreSQL 9 的基础知识,还包括了最新的管理和优化技术,是每位 PostgreSQL 用户不可或缺的参考书籍。
- 物理复制与逻辑复制的区别及应用场景。 4. **高可用性与灾难恢复** - 主从复制的设置与管理。 - 流式复制(Streaming Replication)的原理及配置。 - 故障转移(Failover)机制的设计与实施。 5. **安全性** - ...
PostgreSQL 8.3 是 PostgreSQL 数据库管理系统的一个重要版本,它提供了丰富的功能和改进,适用于各种规模的应用场景。这个版本的文档集包括了多个方面,帮助用户从入门到精通掌握 PostgreSQL 的使用。 1. **...
逻辑复制使得 PostgreSQL 能够适应更广泛的应用场景,比如数据分区、多源同步和自定义数据处理。通过灵活的发布和订阅机制,开发者可以根据业务需求定制数据复制方案,实现高效、安全的数据同步。
5. **PostgreSQL复制原理及高可用集群**:复制和高可用性是数据库系统的核心特性,这部分内容会深入解释PostgreSQL的复制机制(如流复制、并行复制等),以及如何构建和维护高可用集群,确保数据的安全性和服务的...
通过阅读《POSTGRESQL服务器编程》这本书,读者不仅可以掌握POSTGRESQL的基本操作,还能深入理解其高级特性和服务器编程技巧,同时也能了解到Greenplum在大数据场景下的应用。对于想要在数据库开发、运维或者大数据...
PostgreSQL是一种功能强大的开源关系数据库管理系统,其稳定性和性能在业内广受赞誉。该系统支持SQL标准,并提供了许多高级特性,如事务处理、多版本并发控制(MVCC)、复杂查询支持以及丰富的数据类型。本资源是...
1. **实现LRU和MRU替换算法**:首先,需要实现这两种替换策略,并将其集成到PostgreSQL缓冲池管理代码中。 2. **设计实验方案**:定义一系列测试用例,包括不同类型的查询以及不同大小的缓冲池。 3. **收集数据**:...
- 索引类型,包括B-Tree、GiST、SP-GiST、GIN和Brin等,以及它们的应用场景。 - 触发器、存储过程和函数的实现,用于业务逻辑的扩展和数据验证。 - JSONB支持,展示了PostgreSQL在处理非结构化数据的能力。 2. *...
教程可能还会涉及一些常见的商业和开源DBMS,如Oracle、MySQL、SQL Server和PostgreSQL,以及NoSQL数据库如MongoDB和Cassandra,让读者了解不同数据库系统的特点和适用场景。 最后,教程可能会包含一些实践项目,...
- 触发器的实现机制及其应用场景。 - 扩展性与可维护性的最佳实践。 4. **安全性和备份恢复**: - 用户权限管理与角色分配策略。 - 数据加密技术的应用。 - 备份与恢复方案的设计与实施。 5. **性能监控与...
通过这四本书的学习,你可以全面了解PostgreSQL的基础和高级特性,以及Greenplum如何在大规模数据场景下发挥优势。这不仅包括理论知识,还有大量的实践案例和技巧,帮助你在数据库管理和数据分析领域建立起坚实的...
总的来说,《数据库技术原理与应用教程》的配套课件提供了丰富的学习资源,帮助学习者不仅理解理论知识,还能掌握实际操作技能,从而更好地适应数据库领域的各种应用场景。通过深入学习和实践,可以提升在数据管理、...
这使得PostgreSQL能适应各种复杂的应用场景,提供强大的定制能力。 在安全方面,PostgreSQL提供了用户权限管理和角色系统,文档详细阐述了如何设置和管理这些功能,以保护数据库免受未经授权的访问。 最后,文档中...