pgsql查询优化之模糊查询实例详解

 更新时间:2019年07月28日 11:20:21   作者:_AlexYIN  
这篇文章主要给大家介绍了关于pgsql查询优化之模糊查询的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用pgsql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

一直以来,对于搜索时模糊匹配的优化一直是个让人头疼的问题,好在强大pgsql提供了优化方案,下面就来简单谈一谈如何通过索引来优化模糊匹配

案例

我们有一张千万级数据的检查报告表,需要通过检查报告来模糊搜索某个条件,我们先创建如下索引:

CREATE INDEX lab_report_report_name_index ON lab_report USING btree (report_name);

然后搜个简单的模糊匹配条件如 LIKE "血常规%",可以发现查询计划生成如下,索引并没有被使用上,这是因为传统的btree索引并不支持模糊匹配

查阅文档后发现,pgsql可以在Btree索引上指定操作符:text_pattern_ops、varchar_pattern_ops和bpchar_pattern_ops,它们分别对应字段类型text、varchar和char,官方解释为“它们与默认操作符类的区别是值的比较是严格按照字符进行而不是根据区域相关的排序规则。这使得这些操作符类适合于当一个数据库没有使用标准“C”区域时被使用在涉及模式匹配表达式(LIKE或POSIX正则表达式)的查询中。”, 有些抽象,我们先试试看。创建如下索引并查询刚才的条件 LIKE"血常规%":(参考pgsql的文档https://www.postgresql.org/docs/10/indexes-opclass.html)

CREATE INDEX lab_report_report_name_index ON lab.lab_report (report_name varchar_pattern_ops);

发现确实可以走索引扫描 ,执行时间也从213ms优化到125ms,但是,如果搜索LIKE "%血常规%"就又会走全表扫描了! 这里我们引入本篇博客的主角"pg_trgm"和"pg_bigm"。

创建这两个索引前分别需要引入如下两个扩展包 :

CREATE EXTENSION pg_trgm;
CREATE EXTENSION pg_bigm;

这两个索引的区别是:“pg_tigm”为pgsql官方提供的索引,"pg_tigm"为日本开发者提供。下面是详细的对比:(参考pg_bigm的文档http://pgbigm.osdn.jp/pg_bigm_en-1-2.html)

Comparison with pg_trgm

Thepg_trgmcontrib module which provides full text search capability using 3-gram (trigram) model is included in PostgreSQL. The pg_bigm was developed based on the pg_trgm. They have the following differences:

Functionalities and Features pg_trgm pg_bigm
Phrase matching method for full text search 3-gram 2-gram
Available index GIN and GiST GIN only
Available text search operators LIKE (~~), ILIKE (~~*), ~, ~* LIKE only
Full text search for non-alphabetic language
(e.g., Japanese)
Not supported (*1) Supported
Full text search with 1-2 characters keyword Slow (*2) Fast
Similarity search Supported Supported (version 1.1 or later)
Maximum indexed column size 238,609,291 Bytes (~228MB) 107,374,180 Bytes (~102MB)

(*1) You can use full text search for non-alphabetic language by commenting out KEEPONLYALNUM macro variable in contrib/pg_trgm/pg_trgm.h and rebuilding pg_trgm module. But pg_bigm provides faster non-alphabetic search than such a modified pg_trgm.

(*2) Because, in this search, only sequential scan or index full scan (not normal index scan) can run.

pg_bigm 1.1 or later can coexist with pg_trgm in the same database, but pg_bigm 1.0 cannot.

如无特殊要求推荐使用"pg_bigm",我们测试一下效果:

可以使用位图索引扫描,对于本次案例,使用pg_trgm效果同pg_bigm。

以上

本文只是简单的介绍许多细节并未做深入的分析,欢迎留言指教或者讨论

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

相关文章

  • postgresql踩坑系列之关于to_date()问题

    postgresql踩坑系列之关于to_date()问题

    这篇文章主要介绍了postgresql踩坑系列之关于to_date()问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • PostgreSQL定时清理旧数据的实现方法

    PostgreSQL定时清理旧数据的实现方法

    最近觉得数据库中每日数据不需要都保持,只需要保留30天的,所以这篇文章给大家介绍了PostgreSQL定时清理旧数据的实现方法,文中通过代码示例和图文给大家介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-03-03
  • postgres 连接数查看与设置操作

    postgres 连接数查看与设置操作

    这篇文章主要介绍了postgres 连接数查看与设置操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • windows PostgreSQL 9.1 安装详细步骤

    windows PostgreSQL 9.1 安装详细步骤

    这篇文章主要介绍了windows PostgreSQL 9.1 安装详细步骤,需要的朋友可以参考下
    2016-11-11
  • PostgreSQL逻辑复制解密原理解析

    PostgreSQL逻辑复制解密原理解析

    逻辑复制,是基于复制标识复制数据及其变化的一种方法,区别于物理复制对页面操作的描述,逻辑复制是对事务及数据元组的一种描述,这篇文章主要介绍了PostgreSQL逻辑复制解密原理解析,需要的朋友可以参考下
    2022-09-09
  • postgresql 实现查询某时间区间的所有日期案例

    postgresql 实现查询某时间区间的所有日期案例

    这篇文章主要介绍了postgresql 实现查询某时间区间的所有日期案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • postgresql中时间转换和加减操作

    postgresql中时间转换和加减操作

    这篇文章主要介绍了postgresql中时间转换和加减操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Linux CentOS 7源码编译安装PostgreSQL9.5

    Linux CentOS 7源码编译安装PostgreSQL9.5

    这篇文章主要为大家详细介绍了Linux CentOS 7源码编译安装PostgreSQL9.5的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • 如何在PostgreSQL中创建只读权限和读写权限的账号

    如何在PostgreSQL中创建只读权限和读写权限的账号

    一个良好的账号管理策略对于数据库的安全和数据的完整性至关重要,通过为不同的用户设置适当的权限,可以确保他们只能访问他们需要的数据,并防止对敏感数据的意外或恶意访问,本文介绍在 PostgreSQL中创建只读权限和读写权限的账号的步骤和方法,感兴趣的朋友一起看看吧
    2023-08-08
  • 关于向PostgreSQL数据库插入Date类型数据报错问题解决方案

    关于向PostgreSQL数据库插入Date类型数据报错问题解决方案

    本文给大家介绍在将数据库从Oracle改为PostgreSQL时遇到的日期类型插入错误,通过使用PostgreSQL的特定语法和更改动态SQL语句解决了问题,本文给大家介绍的非常详细,需要的朋友参考下吧
    2024-12-12

最新评论