背景
在数据库领域,模糊查询是一种常见且颇具挑战性的需求。对于前置模糊查询(如`like '%xxx'`)与后置模糊查询(如`like 'xxx%'`),B-TREE索引能够提供解决方案。然而,对于前后均含模糊条件(如`like '%xxx%'`)以及涉及正则表达式的复杂查询,许多数据库则显得束手无策,只能采取全表扫描的方式,逐条记录处理。
但PostgreSQL因其强大的开放性和创新性的索引机制,如GIN、GIST、RUM等,使得上述难题得以破解。这些自定义索引方法赋予PostgreSQL支持前后模糊查询与正则表达式的能力,进一步提升了其在高性能搜索场景下的表现力。
GIN(Generalized Inverted Index)索引适用于存储数组、全文检索类型等列中的值,并将其存入类似B+TREE的树形结构中。对于频繁出现的值,GIN会将其存储至独立页面,从而优化检索效率。为了应对插入、更新操作引起的大量元素变动,PostgreSQL引入了一种类似于mysql索引缓冲区的机制,待缓冲区满后再合并到树结构中。这样保证了查询时无需等待合并即可直接读取缓冲区数据,但在特定情况下,查询速度可能会因缓冲区过大而受到影响。
GIST(Generalized Search Tree)是一种归纳树结构,用于解决B-TREE和GIN无法妥善处理的数据减少问题,如范围交集、包含关系等复杂检索场景。其通过聚类算法将相关键值聚集在同一组内,便于检索。用户可以通过自定义数据类型并实现相应的GIST索引来扩展其功能,如PostgreSQL已内置的range和geometry类型。
SP-GIST(Space-Partitioned GIST)是对GIST的扩展,具备节点无交叉、索引深度可变以及每个物理索引页可对应多个节点等特点。此外,SP-GIST 支持Kd-tree和文本前缀树等多种检索类型。
RUM 索引借鉴了GIN的设计并对全文检索场景进行了优化,解决了GIN在全文检索时的排名速度慢、短语搜索不可行以及基于时间戳排序等问题。RUM索引在INDEX中加入了额外信息(如TOKEN的位置),因此可以支持上述查询方式,同时也支持双字段索引(如tsvector+TIMeStamp)。
PostgreSQL 支持多种索引方法,其中包括B-Tree、HASH、GIN、GIST、SP-GIST、BRIN以及RUM等,并提供了用户自定义索引接口。针对模糊查询的不同场景,我们可以利用这些索引方法进行优化:
前后模糊和正则表达式查询:gin、gist、rum
具体测试案例:
场景一:中间结果集庞大,返回结果亦多,未限制返回数量
Gin、Gist、Rum的性能对比
场景二:中间结果集庞大,返回结果有限,采用LIMIT限制返回数量
Gin、Gist、Rum的性能对比
场景三:中间结果集较小,匹配精度较高
Gin、Gist、Rum的性能对比
根据测试案例的结果,我们可以得出以下建议:
- 当中间结果集较小(即输入条件较为精确)时,推荐使用GIN索引。
- 当中间结果集较大(即输入条件较为模糊)时,无论是否使用LIMIT限制返回结果,还是涉及游标操作,都建议优先考虑GIST索引。
- 若需进行全文检索或tsvector+timestamp复合查询时,应选择RUM索引。
为了更好地选择合适的索引,建议调整统计粒度、分析表数据,并结合EXPLAIN命令观察各个查询的执行计划,进而根据中间结果集的大小和实际需求选择最合适的HINT策略,确保查询性能最优。
更多参考文献:
- 《PostgreSQL 9.3 pg_trgm增强多字节字符与GIST、GIN索引对正则搜索的支持》
- 《PostgreSQL中文模糊查询性能优化实践》
- 《PostgreSQL全文检索加速实战 - RUM索引接口解析》
- 《双十一技术揭秘 - 毫秒级分词计算有何难,正则表达式与相似度搜索也能轻松应对》
- 《PostgreSQL内部原理》
- 《PostgreSQL索引内部工作原理》
- 《面对万亿级营销场景,实时推荐系统数据库设计的华丽转身》
- 《探究相似度算法 - PostgreSQL的有效相似搜索实现》
- 《PostgreSQL在视频、图片去重与图像搜索业务的应用》
- 《双十一技术幕后 - 物流与动态路径规划技术解析》
- 《PostgreSQL处理百亿级地理位置数据的近邻查询性能》
- 《双十一技术揭秘 - 毫秒级分词有什么难度,尝试正则和相似度查询》
- 《双十一技术揭秘 - 分词与搜索实战》
- 《物联网实时处理应用实践 - 用PostgreSQL每天处理万亿数据》
- 《PostgreSQL 9.5新特性 - BRIN(块范围索引)》
- 《PostgreSQL 9.5新特性 - 支持R-Tree样式的索引策略用于BRIN》
- 《PostgreSQL 9.6黑科技 - Bloom算法索引,一个索引就能支撑任意列组合查询》
- 《双十一技术揭秘 - 毫秒级分词不算什么,正则和相似度才是硬核》
- 《阿里云PostgreSQL pg_hint_plan插件使用指南》
- 《关键时刻HINT展魅力 - PostgreSQL优化器参数优化与执行计划固化实践》
- 《PostgreSQL SQL HINT使用指南》
- 《PostgreSQL特性分析 - 计划提示》
文章内容来源于网络,不代表本站立场,若侵犯到您的权益,可联系多特删除。(联系邮箱:[email protected])
近期热点
最新资讯