索引,简而言之,就是数据的方式。在数据库中,当表的数据量越来越大时,查询速度会逐渐下降。为了快速检索数据、定位可能的记录,我们通常会建立合适的索引。PostgreSQL作为一款强大的数据库管理系统,支持多种索引类型来满足不同的查询需求。
索引虽然占用存储空间、消耗计算资源,但它在提高查询效率方面发挥着重要作用。在PostgreSQL中,所有的索引都是“从属索引”,与表文件物理分离。索引是数据库对象的一种,每种索引都有其独特的访问方法和内部构造。
PostgreSQL以其开放特性而闻名,支持多种数据类型,如GIS、JSON、RANGE、IP、IN等,用户还可以根据业务需求扩展更多类型。针对常用索引,下面简要介绍其原理和应用场景。
B-tree索引是其中最常用的一种。它在可排序数据上的处理等值和范围查询方面表现出色。B树是平衡的,每个叶页面与根由相同数量的内部页面分隔开,因此搜索任何值都需要花费相同的时间。B树适用于大多数情况,但也有其局限性,比如对于特别长的字段或需要频繁执行等值查询的场景,hash索引可能是更好的选择。
Hash索引存储的是被索引字段值的哈希值,只支持等值查询。在pg10之前,由于种种限制,hash索引的使用并不被推荐。但自pg10起,hash索引得到了加强,适用于某些特定场景,如字段值非常长且用户只需要等值搜索的情况。
GIN(Generalized Inverted Index)是一个存储(key,posting list)集合的索引结构,常用于查询索引字段中的部分元素值。在text和json类型字段中检索关键字时,GIN索引能发挥巨大作用。
GIST(Generalized Search Tree)则是一种更灵活的索引架构,可以实现多种不同的索引策略,用于解决一些B-tree和GIN难以处理的问题,如范围相交查询、地理位置中的点面相交查询等。
SPGIST是基于空间分区的索引,适用于在二维平面或其他值域进行的搜索。BRIN(Block Range Index)则是块级索引,通过记录每个数据块或连续数据块的统计信息来提高查询效率。