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

SQL中对字符串字段模糊查询(LIKE)的索引命中情况

SQL中对字符串字段模糊查询(LIKE)的索引命中情况

在SQL数据库中,字符串字段上的索引是否会被LIKE查询使用取决于多种因素,包括数据库类型、索引结构、查询模式以及数据库配置。

主要数据库中的行为

1. MySQL/MariaDB

  • 前缀匹配(pattern%):可以使用B-tree索引
  • 后缀匹配(%pattern)包含匹配(%pattern%):不能使用标准索引
  • 特殊技巧
    -- 使用反向索引处理后缀查询
    ALTER TABLE users ADD COLUMN name_reverse VARCHAR(255);
    CREATE INDEX idx_name_reverse ON users(name_reverse);
    SELECT * FROM users WHERE name_reverse LIKE REVERSE('%son');
    

2. PostgreSQL

  • 前缀匹配:可以使用B-tree索引
  • 复杂模式:需使用pg_trgm扩展
    CREATE EXTENSION pg_trgm;
    CREATE INDEX idx_name_trgm ON users USING gin(name gin_trgm_ops);
    

3. SQL Server

  • 前缀匹配:可以使用索引
  • 包含匹配:可以尝试使用全文索引(FULLTEXT)
    CREATE FULLTEXT INDEX ON users(name);
    

4. Oracle

  • 前缀匹配:可以使用索引
  • 复杂模式:可以使用Oracle Text功能

通用优化建议

  1. 尽量使用前缀匹配LIKE 'abc%'LIKE '%abc'效率高

  2. 考虑使用函数索引(如反向索引)

  3. 对于复杂搜索

    • 使用专门的全文搜索引擎(如Elasticsearch)
    • 使用数据库特定的全文搜索功能
  4. 检查执行计划

    EXPLAIN SELECT * FROM table WHERE column LIKE 'pattern%';
    

何时索引会被使用

查询模式是否可能使用索引
LIKE 'abc%'✅ 是
LIKE '%abc'❌ 否
LIKE '%abc%'❌ 否
LIKE 'abc' (无通配符)✅ 是(等同于=)

高级解决方案

  1. 使用计算列+索引

    ALTER TABLE users ADD name_length AS LENGTH(name);
    CREATE INDEX idx_name_length ON users(name_length);
    
  2. 使用分区表:按字符串前缀分区

  3. 使用专门的搜索引擎:如Elasticsearch、Solr等

记住,索引的使用还取决于数据库优化器的决策,实际应以EXPLAIN分析结果为准。

http://www.dtcms.com/a/281996.html

相关文章:

  • Git问题排查与故障解决详解
  • C++---emplace_back与push_back
  • 工业网络协议桥接设计指南:从LIN到CAN/RS-232的毫秒级互通方案
  • Adobe illustrator、klayout绘制光刻图及其尺寸映射
  • docker的搭建
  • 微信小程序141~150
  • 控制Vue对话框显示隐藏
  • 实例操作:基于 PipeLine 实现 JAVA项目集成 SonarQube代码检测通知 Jenkins
  • 【Linux】基本指令详解(二) 输入\输出重定向、一切皆文件、认识管道、man、cp、mv、echo、cat
  • 如何配置一个简单的docker容器应用?
  • 【2025/07/16】GitHub 今日热门项目
  • 基于 Spring Boot 构建的文件摆渡系统(File Ferry System)
  • Python19 —— 一维数据的处理
  • 小白成长之路-Elasticsearch 7.0 配置
  • Coze工作流无法更新问题处理
  • 如何通过扫描电镜检测汽车清洁度中的硬质颗粒并获取成分信息
  • 【源力觉醒 创作者计划】百度携文心 4.5 入局,开源大模型市场再添一员猛将,与 Qwen3 对比如何?
  • C++修炼:IO流
  • WPF 多窗口分文件实现方案
  • openEuler 22.03 LTS Rootless Docker 安装指南
  • 【MySQL基础】MySQL事务详解:原理、特性与实战应用
  • 每日算法刷题Day49:7.16:leetcode 差分5道题,用时2h
  • c语言-数据结构-二叉树的遍历
  • 数字ic后端设计从入门到精通11(含fusion compiler, tcl教学)全定制设计入门
  • arm版本的ubuntu安装git或者vim等方法
  • 力扣-23.合并K个升序链表
  • Linux 驱动中 Timer / Tasklet / Workqueue 的作用与对比
  • 查看.bin二进制文件的方式(HxD十六进制编辑器的安装)
  • 电路仿真——精密半波整流电路
  • 133. Java 泛型 - 目标类型与方法参数:重载解析与类型推导