当前位置: 首页 > news >正文

PostgreSQL使用LIKE右模糊没有走索引分析验证

建表&数据初始化可参考PostgreSQL 分区表——范围分区SQL实践

背景:

t_common_work_order_loghandle_user_name新建索引后,使用LIKE右模糊匹配查询时,发现走的全表扫描

CREATE INDEX order_log_handle_user_name_index ON t_common_work_order_log (handle_user_name);
EXPLAIN ANALYZE SELECT COUNT( * ) 
FROMt_common_work_order_log 
WHEREhandle_user_name LIKE'张秀%';

在这里插入图片描述

分析:

由于handle_user_name已经建了索引,查询资料发现B-tree索引需要特定的运算符类别(如text_pattern_opsvarchar_pattern_ops )才能让LIKE右模糊生效

PostgreSQL 索引运算符类:text_ops 与 text_pattern_ops 的区别

在 PostgreSQL 中,text_opstext_pattern_ops 是两种不同的运算符类(operator class),它们决定了索引如何支持不同类型的文本比较操作。

text_ops (默认运算符类)

  • 使用数据库的默认排序规则(LC_COLLATE)
  • 支持所有标准的文本比较操作(=, <, >, <=, >=)
  • 适用于常规的相等性检查和排序操作
  • 对于使用 LIKE 或正则表达式等模式匹配操作的查询效率较低

text_pattern_ops

  • 忽略语言环境特定的排序规则,使用简单的逐字符比较
  • 专门优化了以 LIKE~ 开头的模式匹配查询
  • 特别适合前缀搜索(如 column LIKE 'abc%')
  • 不支持常规的 <, > 等比较操作
  • 不适用于需要遵循语言特定排序规则的查询

使用场景示例

-- 使用默认的 text_ops (适合常规比较)
CREATE INDEX idx_name ON users (name);-- 使用 text_pattern_ops (适合模式匹配)
CREATE INDEX idx_name_pattern ON users (name text_pattern_ops);

注意事项

  1. 如果查询混合了常规比较和模式匹配,可能需要创建两个索引
  2. text_pattern_ops 索引对于 LIKE '%suffix' 这样的后缀搜索没有帮助
  3. 对于不区分大小写的模式匹配,考虑使用 citext 类型或表达式索引

选择哪种运算符类取决于具体查询模式。如果主要进行前缀搜索或模式匹配,text_pattern_ops 会提供更好的性能。

确认指定索引的运算符类别

relname输入实际的索引名称,通过查询结果可知当前的handle_user_name索引的运算符类别为默认的text_ops

SELECTi.relname AS index_name,a.attname AS column_name,opc.opcname AS operator_class
FROMpg_index xJOIN pg_class i ON i.oid = x.indexrelidJOIN pg_attribute a ON a.attrelid = x.indrelid AND a.attnum = ANY(x.indkey)JOIN pg_opclass opc ON opc.oid = ANY(x.indclass)
WHEREi.relname = 'order_log_handle_user_name_index';
index_namecolumn_nameoperator_class
order_log_handle_user_name_indexhandle_user_nametext_ops

修改运算符类别为text_pattern_ops

-- 删除旧索引
DROP INDEX IF EXISTS order_log_handle_user_name_index;-- 创建新索引(使用text_pattern_ops)
CREATE INDEX order_log_handle_user_name_index ON t_common_work_order_log (handle_user_name text_pattern_ops);

回退sql

-- 删除旧索引
DROP INDEX IF EXISTS order_log_handle_user_name_index;-- 创建新索引(使用text_pattern_ops)
CREATE INDEX order_log_handle_user_name_index ON t_common_work_order_log (handle_user_name text_ops);

验证

EXPLAIN ANALYZE验证

修改运算符类别为text_pattern_ops再次执行EXPLAIN ANALYZE,可知LIKE右模糊查询索引生效
在这里插入图片描述

查询速度对比

计算方法:查询10次,去掉最大和最小取平均值

默认运算符类别 3.585s

-- 3.510s 3.722s 3.485s 3.732s 3.478s 3.558s 3.729s 3.511s 3.599s 3.564s
SELECT *
FROMt_common_work_order_log 
WHEREhandle_user_name LIKE'张秀%';

text_pattern_ops运算符类别 2.116s

-- 1.753s 2.296s 2.102s 2.159s 2.167s 2.055s 2.048s 2.169s 2.334s 1.934s
SELECT *
FROMt_common_work_order_log 
WHEREhandle_user_name LIKE'张秀%';
http://www.xdnf.cn/news/146323.html

相关文章:

  • 【高频考点精讲】ES6 String的新增方法,处理字符串更方便了
  • CentOS系统防火墙服务介绍
  • 【大模型理解消化的搅碎机】基于6000种商品CSV表格的知识图谱构建
  • 计组1.2.4——计算机系统的层次结构
  • Allegro23.1新功能之OrcadX平台使用操作指导
  • (三) Trae 调试C++ 基本概念
  • 【虚拟机安装Ubuntu 24 LTS】 MobaXterm 连接Access denied错误-安装进度卡“正在传输文件”-固定内网ip
  • 反爬虫机制中的验证码识别:类型、技术难点与应对策略
  • 艾德文·卡特姆:将画布变成屏幕,开启CGI时代
  • ‌CDGP|企业数据安全治理:制定落地战略,护航数字经济高质量发展
  • 求职意向商务/BD简历模板
  • DPIN河内AI+DePIN峰会:共绘蓝图,加速构建去中心化AI基础设施新生态
  • 算法中的数学:gcd与lcm
  • 诗词大会竞赛主持稿串词(二)
  • CKESC SKY 6S 50A_4S 60A 电调专业测评
  • 常见网络安全攻击类型深度剖析(一):恶意软件攻击——病毒、蠕虫、木马的原理与防范
  • 51单片机中断
  • 【补题】Codeforces Round 789 (Div. 1)C. Tokitsukaze and Two Colorful Tapes
  • 智慧党建解决方案-1PPT(40页)
  • ThreadLocal详解与实战指南
  • LabVIEW老旧设备控制
  • Apache Spark 源码解析
  • 线程池配置实现多线程快速处理批量数据
  • 动态ip与静态ip的概念、区别、应用场景
  • 统计文件中单词出现的次数并累计
  • 【玩泰山派】7、玩linux桌面环境xfce - (4)使用gstreamer
  • 点云从入门到精通技术详解100篇-基于二次误差和高斯混合模型的点云配准算法
  • 【DE-III】基于细节增强的模态内和模态间交互的视听情感识别
  • LabVIEW轨道交通动力系统性能监控
  • Spring 与 ActiveMQ 的深度集成实践(一)