引言

LIKE是MySQL中最强大的模糊匹配操作符,也是性能陷阱最多的查询之一。本文将系统解析其高效使用方法,通过实测数据揭示不同场景下的性能表现,并提供企业级优化方案。


一、基础语法与通配符解析

1.1 四种匹配模式详解
-- 前缀匹配(可使用索引)
SELECT * FROM products 
WHERE name LIKE 'Apple%';  -- 匹配'Apple Watch','AirPods Pro'-- 后缀匹配(全表扫描)
SELECT * FROM users 
WHERE email LIKE '%gmail.com'; -- 匹配所有Gmail邮箱-- 前后模糊匹配(全表扫描)
SELECT * FROM logs 
WHERE message LIKE '%error%'; -- 匹配包含error的消息-- 精准字符匹配(_匹配单个字符)
SELECT * FROM books 
WHERE isbn LIKE '978-7-04-0_____'; -- 匹配特定出版社图书
1.2 转义特殊字符方法
-- 查询包含%本身的数据
SELECT * FROM documents 
WHERE content LIKE '%\%%' ESCAPE '\'; -- 查找包含%的文字-- 查询包含_的数据
SELECT * FROM files 
WHERE name LIKE '%\_%' ESCAPE '\'; -- 查找包含下划线的文件名

二、四大性能陷阱与优化方案

陷阱1:前导通配符导致全表扫描

问题复现

SELECT * FROM articles 
WHERE content LIKE '%数据库%'; -- 扫描200万行,耗时4.2s

优化方案

-- 方案1:使用全文索引(0.05s)
ALTER TABLE articles ADD FULLTEXT INDEX idx_content(content);
SELECT * FROM articles 
WHERE MATCH(content) AGAINST('数据库' IN BOOLEAN MODE);-- 方案2:前缀查询改写(0.3s)
SELECT * FROM articles 
WHERE content LIKE '数据库%'  -- 仅前缀匹配可用索引OR content LIKE '%数据库'; -- 后匹配单独处理
陷阱2:大数据字段的LIKE查询

错误示范

-- text字段直接LIKE查询
SELECT * FROM contracts 
WHERE contract_text LIKE '%违约金%'; -- 触发全表扫描+文件排序

优化方案

-- 添加前缀索引并分页查询
ALTER TABLE contracts ADD INDEX idx_text_prefix(contract_text(20));
SELECT * FROM contracts 
WHERE contract_text LIKE '违约金%'  -- 仅前缀匹配
LIMIT 1000;
陷阱3:频繁模糊查询的缓存失效
-- 不同参数导致查询缓存失效
SELECT * FROM products WHERE name LIKE '%手机%'; -- 缓存A
SELECT * FROM products WHERE name LIKE '%电脑%'; -- 缓存B

解决方案

-- 使用固定模式+程序过滤
SELECT * FROM products 
WHERE name LIKE '%电子%'; -- 缓存复用
-- 程序端进一步过滤手机/电脑
陷阱4:UTF8MB4字符集的性能损耗
-- 四字节字符导致索引长度计算异常
SELECT * FROM comments 
WHERE content LIKE '%👍%'; -- 表情符号查询

优化方案

-- 为特殊字段单独建索引
ALTER TABLE comments ADD INDEX idx_content_prefix(content(10));
SELECT * FROM comments 
WHERE content LIKE '👍%'; -- 仅前缀匹配

三、企业级优化方案

3.1 全文索引实战指南
-- 创建全文索引(支持中文需ngram解析器)
ALTER TABLE products ADD FULLTEXT INDEX idx_name_desc(name, description) 
WITH PARSER ngram;-- 布尔模式搜索
SELECT * FROM products 
WHERE MATCH(name, description) 
AGAINST('+手机 -苹果' IN BOOLEAN MODE);-- 相关性排序
SELECT *, MATCH(name) AGAINST('平板') as relevance 
FROM products WHERE MATCH(name) AGAINST('平板') 
ORDER BY relevance DESC;
3.2 搜索引擎整合方案
-- 使用Elasticsearch同步查询
SELECT * FROM products 
WHERE id IN (-- 从ES获取匹配的ID列表SELECT es_id FROM elasticsearch WHERE query='name:智能手机~'
);
3.3 预处理数据方案
-- 新增关键词提取列
ALTER TABLE articles ADD COLUMN keywords VARCHAR(200);
UPDATE articles SET keywords = extract_keywords(content);-- 查询优化
SELECT * FROM articles 
WHERE keywords LIKE '%数据%'; -- 在短文本上查询

四、不同场景下的替代方案

4.1 正则表达式REGEXP
-- 复杂模式匹配(全表扫描)
SELECT * FROM users 
WHERE email REGEXP '^[a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}$';-- 性能对比:LIKE 'pattern%' > REGEXP > LIKE '%pattern%'
4.2 字符串函数方案
-- 使用LOCATE函数
SELECT * FROM products 
WHERE LOCATE('手机', name) > 0; -- 性能与LIKE '%手机%'相当-- 使用SUBSTRING索引优化
SELECT * FROM products 
WHERE SUBSTRING(name, 1, 10) LIKE '手机%';

五、性能实测数据(100万行测试表)

5.1 不同查询方式耗时对比
查询方式响应时间索引使用情况
LIKE 'prefix%'0.002s索引范围扫描
LIKE '%suffix'1.8s全表扫描
LIKE '%infix%'2.1s全表扫描
全文索引MATCH AGAINST0.05s全文索引
REGEXP3.2s全表扫描
5.2 最佳实践选择指南
场景描述推荐方案备注
前缀搜索LIKE 'prefix%'可用索引,性能最佳
后缀/包含搜索(小表)LIKE '%pattern%'数据量<1万行时可用
中文全文搜索全文索引+ngramMySQL5.7+支持
复杂模式匹配正则表达式REGEXP需接受全表扫描
生产环境大数据搜索Elasticsearch整合实时性要求不高的场景

结语:五大黄金法则

  1. 前缀优先:尽量使用LIKE 'prefix%'格式
  2. 索引优化:对查询字段建立合适索引
  3. 数据预处理:添加摘要字段或关键词提取
  4. 方案升级:大数据量使用专业搜索引擎
  5. 缓存策略:对结果进行合理缓存

“模糊查询是把双刃剑,用得好是神器,用不好是性能灾难。”
——《高性能MySQL》作者Baron Schwartz

附录:版本兼容性说明

-- MySQL 5.6:支持基础LIKE查询
-- MySQL 5.7+:支持中文全文索引(ngram)
-- MySQL 8.0+:支持正则表达式索引(实验功能)

通过这篇指南,您将全面掌握LIKE查询的正确使用方式,避免常见的性能陷阱,并在不同场景下选择最优解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96922.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96922.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/96922.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开发者工具与效率提升指南

开发者工具与效率提升指南介绍 在软件开发过程中&#xff0c;选择适当的开发工具和配置优化是提升效率的关键。本指南旨在提供关于常用开发工具、IDE配置、自动化流程及效率脚本的全面资源与建议&#xff0c;以帮助开发者更高效地进行编码和项目管理。 开发工具和IDE配置 常用开…

Python 轻量级的 ORM(对象关系映射)框架 - Peewee 入门教程

文章目录基础创建数据库管理对象定义自己的模型连接数据库并创建表插入数据查询数据更新数据删除数据进阶复合主键模型示例复杂查询示例(以Relation模型为例)基础 创建数据库管理对象 from peewee import *db MySQLDatabase(test_db, userroot, passwordpassword, hostlocal…

《Java反射与动态代理详解:从原理到实践》

1. 反射&#xff08;Reflection&#xff09; 1.1 反射的概述 反射是Java语言的核心特性之一&#xff0c;它允许程序在运行状态下动态获取类的信息并操作类的成员&#xff08;构造方法、成员变量、成员方法&#xff09;。 专业定义 对于任意一个类&#xff0c;都能够知道这个类的…

golang7 数组切片

本视频详细讲解了Go语言中的集合类型数据结构&#xff0c;重点介绍了数组、切片、map和list四种集合类型。特别强调了切片和map的重要性&#xff0c;以及它们在实际开发中的应用。同时&#xff0c;详细阐述了数组的定义、操作及其与切片之间的区别&#xff0c;包括数组类型与元…

k8s-容器化部署论坛和商城服务(小白的“升级打怪”成长之路)

目录 一、配置文件编写 1、数据持久化 2、mysql主从复制 3、php解析环境 4、nginx服务 5、redis主从复制 6、tomcat服务 7、操作命令 8、在每个node节点操作上 9、更改服务文件加入redis缓存和实现访问动静分离 在存储主机上查看 10、更改商城应用文件 二、实现域…

智慧AI消防通道占用检测在危险区域的应用

智慧AI消防通道占用检测&#xff1a;构建工厂与仓库的安全防线在工业生产与物流仓储领域&#xff0c;工厂安全与仓库安全始终是企业运营的核心命题。消防通道作为紧急情况下的“生命通道”&#xff0c;其畅通性直接关系到人员疏散效率与火灾扑救效果。然而&#xff0c;传统人工…

LangGraph-2-Demo

状态&#xff1a;一个共享数据结构&#xff0c;表示应用程序的当前快照。它可以是任何 Python 类型&#xff0c;但通常是 TypedDict 或 Pydantic BaseModel。 节点&#xff1a;Python 函数&#xff0c;用于编码代理的逻辑。它们以当前 状态 作为输入&#xff0c;执行一些计算或…

基于硅基流动API构建智能聊天应用的完整指南

基于硅基流动API构建智能聊天应用的完整指南 一、引言&#xff1a;AI编程工具重塑开发范式 人工智能编程工具正在彻底改变软件开发的方式&#xff0c;使开发者能够快速构建以前需要大量专业知识的复杂应用。本文将深入探讨如何使用硅基流动(SiliconFlow)的API&#xff0c;结合…

深入解析MyBatis中#{}和${}的区别与应用场景

在MyBatis框架的使用过程中&#xff0c;SQL映射文件的编写是核心工作之一。而#{}和${}这两种参数占位符语法&#xff0c;虽然看起来相似&#xff0c;却有着本质的区别。正确理解和使用它们&#xff0c;不仅关系到应用程序的安全性&#xff0c;还会影响系统性能。本文将全面剖析…

ELKB日志分析平台 部署

ElasticSearch ELKB 日志分析 介绍 docker-compose一键部署ELK(elasticsearchlogstashkibana) 以下是使用 Docker Compose 部署 Elasticsearch、Logstash、Kibana 和 Beats&#xff08;以 Filebeat 为例&#xff09; 的完整方案&#xff0c;涵盖配置文件、关键参数说明及部署步…

File IO 字节流 | Java 学习日志 | 第 12 天

File 1.概述 File表示路径&#xff0c;可以表示文件和文件夹&#xff0c;可以存在也可以不存在 相对路径&#xff08;相对当前项目&#xff09;&#xff0c;绝对路径。 构造方法File(file/string)&#xff0c;File(file/string,string)。 public static void main(String[] ar…

基于SpringBoot的服装公司进销存管理系统设计与开发(代码+数据库+LW)

摘要 随着服装行业竞争的加剧&#xff0c;传统手工或简单电子表格管理进销存的方式已难以满足现代企业的需求&#xff0c;效率低下且易出错。基于SpringBoot框架的服装公司进销存管理系统应运而生&#xff0c;旨在通过信息化手段提升运营效率和服务质量。系统特别设计了销售员…

openFeign用的什么协议,dubbo用的什么协议

简单直接的答案是&#xff1a;​OpenFeign​&#xff1a;默认使用 ​HTTP​ 协议&#xff08;通常是 HTTP/1.1&#xff0c;也支持 HTTP/2&#xff09;&#xff0c;通信格式为 ​RESTful JSON。​Dubbo​&#xff1a;默认使用 ​Dubbo 协议​&#xff08;一种自定义的、基于 TCP…

Android SystemServer 系列专题【篇四:SystemServerInitThreadPool线程池管理】

本篇重点介绍一下SystemServerInitThreadPool&#xff0c;顾名思义此类针对SystemServer进程的提供了一套ThreadPool线程池的统一标准方案&#xff0c;下面从源码和日志的角度来剖析一个这个类。1、SystemServerInitThreadPool单例设计SystemServerInitThreadPool的源码路径在f…

2014-2024高教社杯全国大学生数学建模竞赛赛题汇总预览分析

一、分析赛题核心意义收集近 11 年的赛题并非简单的 “题目存档”&#xff0c;而是为了从历史规律、能力匹配、实战准备三个维度为参赛者或研究者提供价值。1.1把握竞赛命题趋势&#xff0c;降低选题盲目性赛题命题往往紧扣当年社会热点、科技前沿与行业痛点&#xff08;如 202…

一个头像图片滚动轮播组件(React实现)

遇到一个效果&#xff0c;组件库里没有现成能用的组件&#xff0c;于是手搓了一个&#xff0c;传入图片url列表&#xff0c;和其他配置项即可直接使用。 轮播效果实现思路 假设共有10张图片轮流滚动&#xff0c;轮播图展示3张图片。给正在轮播的图片绑定visible类&#xff0c;轮…

从入门到理解:支持向量机的核心原理与实战思路

一、SVM 的核心目标&#xff1a;找 “最好” 的超平面。1.1 什么是 “超平面”&#xff1f;超平面是一个几何概念&#xff0c;简单来说&#xff1a;在 2 维空间&#xff08;平面&#xff09;中&#xff0c;超平面是一条直线&#xff08;1 维&#xff09;&#xff1b;在 3 维空间…

Python 办公自动化实战:Excel 批量处理 + 自动发邮件

Python 办公自动化实战&#xff1a;Excel 批量处理 自动发邮件关键词&#xff1a; Python办公自动化 • Pandas • OpenPyXL • Email • 定时任务 摘要&#xff1a; 每月底还在手动处理几十份Excel报表并邮件发送&#xff1f;快来学习如何用Python全自动完成&#xff01;本文…

高教杯数学建模2021-C 生产企业原材料的订购与运输

某建筑和装饰板材的生产企业所用原材料主要是木质纤维和其他植物素纤维材料, 总体可分为 A&#xff0c;B&#xff0c;C 三种类型。该企业每年按 48 周安排生产&#xff0c;需要提前制定 24 周的原 材料订购和转运计划&#xff0c;即根据产能要求确定需要订购的原材料供应商&…

【Python系列】Flask 和 FastAPI对比

博客目录1. 类型和设计目标2. 性能3. 异步支持4. 数据验证和文档5. 学习曲线和生态6. 使用场景示例对比Flask&#xff08;同步&#xff09;FastAPI&#xff08;异步&#xff09;总结Flask 和 FastAPI 都是 Python 中流行的 Web 框架&#xff0c;但它们的设计目标、特性和适用场…