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

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

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

主要数据库中的行为

1. MySQL/MariaDB

  • 前缀匹配(pattern%):可以使用B-tree索引

  • 后缀匹配(%pattern) 包含匹配(%pattern%):不能使用标准索引

  • 特殊技巧

    sql 复制代码
    -- 使用反向索引处理后缀查询
    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扩展

    sql 复制代码
    CREATE EXTENSION pg_trgm;
    CREATE INDEX idx_name_trgm ON users USING gin(name gin_trgm_ops);

3. SQL Server

  • 前缀匹配:可以使用索引

  • 包含匹配 :可以尝试使用全文索引(FULLTEXT)

    sql 复制代码
    CREATE FULLTEXT INDEX ON users(name);

4. Oracle

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

通用优化建议

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

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

  3. 对于复杂搜索

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

    sql 复制代码
    EXPLAIN SELECT * FROM table WHERE column LIKE 'pattern%';

何时索引会被使用

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

高级解决方案

  1. 使用计算列+索引

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

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

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

相关推荐
程序新视界34 分钟前
MySQL中的数据去重,该用DISTINCT还是GROUP BY?
数据库·后端·mysql
谱写秋天39 分钟前
软考-系统架构设计师 关系数据库详细讲解
数据库·系统架构·软考架构师
檀越剑指大厂43 分钟前
平替MongoDB:金仓多模数据库助力电子证照国产化实践
数据库·mongodb
cpsvps2 小时前
环境变量管理于美国服务器多环境部署的实施标准
运维·服务器·数据库
IvorySQL2 小时前
【生态再升级】IvorySQL 4.5 与银河麒麟高级服务器操作系统V11完成适配认证!
运维·服务器·数据库·postgresql·ivorysql
准时准点睡觉2 小时前
SQL Server提示:安装程序无法与下载服务器联系。请提供 Microsoft机器学习服务器安装文件的位置。。。。
服务器·sql
CYX_cheng2 小时前
sqlsugar sqlite
数据库·sqlite
茉莉玫瑰花茶3 小时前
Redis - Bitmap 类型
数据库·redis·缓存
IvorySQL3 小时前
聚焦六大功能:PostgreSQL 18 新特性深度解析
数据库·postgresql·开源
饿了我会自己捡代码吃3 小时前
【MySQL】使用C/C++链接mysql数据库
c语言·数据库·mysql