怎么在MySQL中利用Like进行模糊搜索及索引失效排查

舞夢輝影

舞夢輝影

2026-04-14

250人浏览

原创

mysql中like右模糊(如'abc%')可走索引,左模糊('%abc')或全模糊('%abc%')无法利用b+树索引导致全表扫描;必须用explain验证,key为null或type为all即未走索引。

怎么在mysql中利用like进行模糊搜索及索引失效排查

LIKE右模糊能走索引,但左模糊或全模糊直接失效

MySQL 的 LIKE 查询是否走索引,只看通配符位置:只要模式以 % 开头(如 '%abc''%abc%'),B+ 树索引就无法定位起始位置,只能全表扫描。只有后缀通配符(如 'abc%')才能触发 range 类型的索引扫描。

常见错误现象:EXPLAIN 显示 type = ALLkey = NULL,同时 rows 接近表总行数。

  • ✅ 有效写法:WHERE name LIKE '张%'(走索引)
  • ❌ 失效写法:WHERE name LIKE '%张'WHERE name LIKE '%张%'(不走索引)
  • ⚠️ 注意:WHERE name LIKE '张_'(下划线单字符)也走索引,和 '张%' 同理,因为前缀固定

EXPLAIN 是唯一可信的索引使用判断依据

别猜,直接 EXPLAIN 看执行计划。关键字段就两个:typekey。只要 keyNULL,或者 typeALL / index,基本可以确认索引没被用上。

使用场景:上线前查慢查询、开发时验证 SQL 是否符合预期、排查线上 LIKE 查询突然变慢。

  • type = range:说明走了索引范围扫描(右模糊典型表现)
  • type = ref:说明走了等值索引(如 name = '张三'
  • 如果 Extra 出现 Using filesortUsing temporary,即使走了索引,也可能因排序/分组引发额外开销

索引列上加函数或运算,等于主动废掉索引

LIKE 本身不“加函数”,但很多人会误套一层函数再查,比如 WHERE UPPER(name) LIKE 'ZHANG%',或者更隐蔽的 WHERE CONCAT('', name) LIKE '张%' —— 这些都会让索引失效,原理和 UPPER()DATE() 一样:索引存的是原始值,不是计算后的结果。

MySQL(Linux)
MySQL(Linux)

MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。

下载

性能影响:小表看不出,大表可能从毫秒级变成秒级甚至分钟级。

  • ❌ 错误示例:WHERE IFNULL(name, '') LIKE '张%'WHERE TRIM(name) LIKE '张%'
  • ✅ 替代思路:确保字段本身非空、无前后空格;业务层预处理;或改用生成列 + 索引(MySQL 5.7+)
  • ⚠️ 隐式转换也属同类问题:比如 nameVARCHAR,却写成 WHERE name = 123,MySQL 会转成 WHERE CAST(name AS SIGNED) = 123,同样绕过索引

想搜中间内容?别硬扛 LIKE,换方案

当必须支持 '%关键词%' 场景(如后台管理搜用户名含某字),靠普通 B+ 树索引已无解。强行建索引、调优器参数都收效甚微。

可选路径很明确:要么换索引类型,要么换查询方式。

  • ✅ 全文索引(FULLTEXT):适合中文需分词的长文本,但对短字段(如姓名)效果一般,且 MySQL 内置中文分词弱,常需配合 ngram 插件
  • ✅ 前缀索引 + 应用层兜底:对 name 建前缀索引(如 INDEX idx_name_4 (name(4))),先快速筛出前 4 字匹配的候选集,再在应用层做二次过滤
  • ✅ 倒排结构外置:把姓名切分为所有可能子串(如 “张三” → “张”、“三”、“张三”),存到 Redis 或 Elasticsearch,查得快、扩展性强

真正容易被忽略的是:很多团队花几天调 optimizer_switch 或反复 ANALYZE TABLE,却没意识到问题根本不在优化器——是查询模式和索引机制的天然冲突。接受这个前提,才能跳出去找解法。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
墨刀AI提示词教学
墨刀AI提示词教学

本合集由PHP中文网精心整理,为您提供全面的墨刀AI提示词教学。内容涵盖高质量原型撰写公式与实操窍门,助您轻松掌握AI设计工具。无论是零基础入门还是进阶技巧,都能让您快速上手,大幅提升产品设计与协作效率。

2026.08.04

8

21

墨刀AI完整入门
墨刀AI完整入门

PHP中文网为您倾力打造墨刀AI保姆级入门指南完整版!本合集从零基础讲起,涵盖AI生成原型、提示词优化、图片转原型及多轮对话等核心功能。无论您是新手还是进阶用户,都能轻松掌握产品设计全流程。快来PHP中文网,一键解锁高效设计技巧,让想法即刻成型!

2026.08.04

1

20

墨刀AI进阶技巧
墨刀AI进阶技巧

本合集由PHP中文网精心整理,为您提供墨刀AI核心进阶策略指南。内容涵盖高效提示词写作、原型智能生成与微调、结构化导图制作及行业分析报告输出等实战技巧。助您轻松掌握AI设计工具,大幅提升产品设计与团队协作效率。

2026.08.04

7

14

火山引擎实名认证失败怎么办
火山引擎实名认证失败怎么办

火山引擎实名认证失败可能与证件信息填写错误、姓名或企业信息不一致、证件照片不清晰、营业执照状态异常、手机号验证失败或审核资料不完整有关。本专题整理个人认证、企业认证、资料上传、审核退回、重新提交和认证不通过的常见处理方法。

2026.08.04

4

10

火山引擎域名备案流程详解
火山引擎域名备案流程详解

火山引擎域名备案适合需要在火山引擎云服务器、对象存储、CDN或网站服务上绑定域名的用户参考。本专题整理备案入口、账号实名认证、备案类型选择、主体信息填写、网站信息提交、资料上传、初审核验、管局审核和备案失败排查,帮助用户完成网站上线前的备案流程。

2026.08.04

0

10

火山引擎DNS解析配置步骤
火山引擎DNS解析配置步骤

使用火山引擎DNS解析网站域名时,需要确认域名已完成管理接入,并正确配置服务器IP、CNAME地址或验证记录。本专题整理域名添加、记录类型选择、TTL设置、解析状态检查、备案和访问测试等流程,适合新手搭建网站时参考。

2026.08.04

2

10

火山引擎对象存储使用教程
火山引擎对象存储使用教程

火山引擎对象存储适合用于网站图片、视频文件、备份数据、静态资源和应用附件管理。本专题整理TOS控制台入口、存储桶创建、地域选择、权限设置、文件上传、访问链接生成、CDN加速、费用查看和常见上传或访问失败问题,帮助用户快速掌握对象存储基础操作。

2026.08.04

1

10

火山引擎云服务器使用教程
火山引擎云服务器使用教程

火山引擎云服务器使用教程适合第一次购买、部署和管理云服务器的用户参考。本专题整理控制台入口、实例创建、地域和配置选择、系统镜像设置、安全组放行、远程连接、网站部署、续费计费和常见连接失败问题,帮助用户快速完成云服务器基础使用流程。

2026.08.04

5

10

火山引擎API Key绑定大模型教程
火山引擎API Key绑定大模型教程

火山引擎API Key怎么绑定大模型适合需要在火山方舟、应用后台、脚本工具或AI编程软件中调用模型的开发者参考。本专题整理控制台服务开通、API Key创建、模型权限检查、模型ID选择、Base URL填写、调用测试和鉴权失败排查,帮助用户完成从密钥到模型调用的配置流程。

2026.08.04

2

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 122人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 221人学习

phpEnv手册
phpEnv手册

共0课时 | 0人学习