mysql like查询怎么走索引_mysql模糊查询优化方法

发布时间 - 2026-01-22 00:00:00    点击率:
LIKE 查询能走索引,但仅当通配符不在最左侧;'abc%'可走索引(range),'ab%c'部分走索引,'%abc'或'%abc%'不走索引;可用FULLTEXT、反向索引或结构化设计优化。

LIKE 查询能走索引吗?取决于通配符位置

能,但仅当通配符不在最左侧时。MySQL 的 B+ 树索引是按字典序存储的,LIKE 'abc%' 可以利用索引前缀匹配快速定位起始位置;而 LIKE '%abc'LIKE '%abc%' 无法确定索引扫描起点,只能全表扫描。

常见错误现象:EXPLAIN 显示 type=ALLkey=NULL,即使字段有索引也无效。

  • LIKE 'abc%' → 可走索引(range 类型)
  • LIKE 'ab%c' → 部分走索引(只匹配到 'ab' 前缀,后续字符需回表过滤)
  • LIKE '%abc'LIKE '%abc%' → 不走索引(除非用全文索引或倒排)

用 FULLTEXT 替代 %LIKE% 的模糊搜索

当必须支持任意位置匹配(如搜索“数据库优化”中的“优化”),又想避免全表扫描,FULLTEXT 是更合适的选择,尤其适用于中文需配合 ngram 分词器。

使用前提:表引擎为 InnoDBMyISAM,字段类型为 CHAR/VARCHAR/TEXT,且已建立全文索引。

ALTER TABLE articles ADD FULLTEXT(title, content);
SELECT * FROM articles WHERE MATCH(title, content) AGAINST('优化' IN NATURAL LANGUAGE MODE);

注意:AGAINST() 不支持通配符组合,'优*' 仅在布尔模式生效,且最小词长默认为 4(中文需调 innodb_ft_min_token_size 或用 ngram)。

前导通配符场景下,考虑生成反向索引列

若业务强依赖 LIKE '%abc'(如查“手机号末四位”),可新增一个 REVERSE(phone) 列并建索引,把后缀查询转为前缀查询。

操作步骤:

  • 添加计算列:ALTER TABLE users ADD COLUMN phone_rev VARCHAR(20) STORED AS (REVERSE(phone));
  • 建索引:CREATE INDEX idx_phone_rev ON users(phone_rev);
  • 改写查询:WHERE phone_rev LIKE REVERSE('1234') + '%' → 实际执行 WHERE phone_rev LIKE '4321%'

该方案对写入有轻微开销(计算列需维护),但能稳定走索引;注意 REVERSE() 对中文 UTF8MB4 字符安全,但不适用于含 emoji 等四字节字符的混合场景。

LIKE 查询性能差?先确认是否真的需要模糊匹配

很多所谓“模糊需求”其实可通过结构化方式规避:比如地址拆成 province/city/district 字段,用等值或范围查询;用户昵称搜索可结合拼音首字母索引 + 全文索引兜底。

容易被忽略的关键点:

  • 索引长度限制:VARCHAR(255) 字段建了索引,但 LIK

    E 'a%' AND LENGTH(col) > 100
    仍可能因索引未覆盖足够长度而失效
  • 字符集影响:utf8mb4_unicode_ciutf8mb4_general_ci 在排序和比较行为上不同,可能导致预期外的索引跳过
  • 隐式类型转换:WHERE name LIKE 123 会触发 name 列隐式转数字,索引完全失效


# mysql  # 字节  # ai  # 隐式类型转换  # red  # NULL  # char  # Length  # 类型转换  # column  # table  # 数据库  # 不走  # 能走  # 可走  # 结构化  # 隐式  # 适用于  # 布尔  # 不支持  # 可通过  # 但不 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Python高阶函数应用_函数作为参数说明【指导】  如何在云服务器上快速搭建个人网站?  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  浅谈Javascript中的Label语句  焦点电影公司作品,电影焦点结局是什么?  如何用PHP快速搭建高效网站?分步指南  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  jquery插件bootstrapValidator表单验证详解  如何在Windows 2008云服务器安全搭建网站?  Laravel如何使用Livewire构建动态组件?(入门代码)  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  浅析上传头像示例及其注意事项  如何选择PHP开源工具快速搭建网站?  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  html如何与html链接_实现多个HTML页面互相链接【互相】  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  常州企业网站制作公司,全国继续教育网怎么登录?  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  如何获取免费开源的自助建站系统源码?  音响网站制作视频教程,隆霸音响官方网站?  公司门户网站制作流程,华为官网怎么做?  Python图片处理进阶教程_Pillow滤镜与图像增强  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  黑客如何利用漏洞与弱口令入侵网站服务器?  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  Laravel如何实现API速率限制?(Rate Limiting教程)  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  网站制作企业,网站的banner和导航栏是指什么?  bing浏览器学术搜索入口_bing学术文献检索地址  iOS中将个别页面强制横屏其他页面竖屏  Laravel怎么实现验证码(Captcha)功能  智能起名网站制作软件有哪些,制作logo的软件?  再谈Python中的字符串与字符编码(推荐)  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  java中使用zxing批量生成二维码立牌  如何快速搭建虚拟主机网站?新手必看指南  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  如何在搬瓦工VPS快速搭建网站?  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  如何为不同团队 ID 动态生成多个“认领值班”按钮  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】