MySQL LIKE查詢終極指南:模糊匹配的利刃與性能深淵

引言

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;但它們的設計目標、特性和適用場…