首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 模糊查詢深度解析:LIKE vs REGEXP 性能與用法對比

     編輯:MySQL 資料庫相關知識

兩大模糊匹配利器

MySQL 提供兩種模糊查詢方式:LIKE(簡單模式匹配)和 REGEXP(正則表達式匹配)。選擇哪一種,取決於業務複雜度與性能要求。

LIKE:簡單高效的模式匹配

通配符語法

通配符含義正則等價示例
%任意長度字符(含 0 個).*'%abc%' 包含 abc
_單個任意字符.'_abc' 以任意字符開頭後接 abc

常用模式

-- 以 'a' 開頭
WHERE name LIKE 'a%'

-- 以 'a' 結尾
WHERE name LIKE '%a'

-- 包含 'a'
WHERE name LIKE '%a%'

-- 第二個字符是 'b'
WHERE name LIKE '_b%'

性能特點

  • 全表掃描風險:LIKE '%keyword%' 導致全表掃描,不走索引
  • 前綴索引優化:LIKE 'prefix%' 可利用 B-Tree 索引
  • 字符集影響:多字節字符集下 _ 匹配單字符而非單字節

REGEXP:強大的正則表達式引擎

語法速查

元字符說明示例
^行首'^abc' 以 abc 開頭
$行尾'abc$' 以 abc 結尾
.任意單字符'a.c' 匹配 abc、axc 等
*前項 0 次或多次'ab*c' 匹配 ac、abc、abbc...
+前項 1 次或多次'ab+c' 匹配 abc、abbc...
?前項 0 次或 1 次'ab?c' 匹配 ac、abc
|或邏輯'cat|dog' 匹配 cat 或 dog
[]字符集合'[aeiou]' 匹配任意元音
[^]排除字符集'[^0-9]' 非數字字符
{n}精確 n 次'a{3}' 匹配 aaa
{n,m}n 到 m 次'a{2,4}' 匹配 aa、aaa、aaaa

實戰示例

-- 匹配包含 a、b 或 c 的名稱
SELECT * FROM users WHERE name REGEXP 'a|b|c';

-- 匹配以字母開頭、以數字結尾
SELECT * FROM codes WHERE code REGEXP '^[A-Za-z].*[0-9]$';

-- 匹配連續兩個 b
SELECT * FROM test WHERE val REGEXP 'b{2}';

性能對比與選擇指南

維度LIKEREGEXP
語法複雜度簡單,兩個通配符完整正則語法,學習成本高
索引利用前綴模式可用索引通常全表掃描,不走索引
執行速度快(C 級實現)較慢(正則引擎開銷大)
適用場景前綴/後綴/包含匹配複雜格式驗證、數據清洗
黃金法則: 能用 LIKE 解決的,絕不使用 REGEXP。僅在業務邏輯必須正則時(如郵箱、手機號格式驗證、複雜文本提取)才啟用 REGEXP。

Hibernate 中使用 REGEXP

Hibernate 原生不支持 REGEXP,需通過自定義方言註冊函數:

public class MySQL5DialectRegexp extends org.hibernate.dialect.MySQLInnoDBDialect {
    public MySQL5DialectRegexp() {
        super();
        registerFunction("regexp", 
            new SQLFunctionTemplate(Hibernate.BOOLEAN, "?1 REGEXP ?2"));
    }
}

配置 hibernate.dialect 為該類全路徑後,HQL 即可使用:

FROM User u WHERE regexp(u.name, 'a|b|c') = 1
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved