高效使用mysql like的关键在于通配符位置、字段索引和匹配逻辑是否合理:前缀匹配(如'张%')可走索引,后缀或中间匹配(如'%张%')易致全表扫描,固定长度占位(如'a__9')可能部分利用索引。

MySQL中用LIKE做模糊搜索很常见,但“高效”关键不在写法多花哨,而在**通配符位置、字段索引和匹配逻辑是否合理**。盲目套用%关键词%容易触发全表扫描,尤其在大表上会明显拖慢查询。
通配符怎么用才不伤性能
两个核心通配符:%(匹配零或多个字符)、_(只匹配一个字符)。它们的位置决定MySQL能否利用索引:
-
前缀匹配(推荐):如
WHERE name LIKE '张%'——MySQL可走索引,速度快; -
后缀或中间匹配(慎用):如
WHERE name LIKE '%张%'或WHERE name LIKE '%张'——无法使用常规B+树索引,基本等于全表扫; -
固定长度占位(精准控制):如
WHERE code LIKE 'A__9'表示4位编码,第1位是A、第4位是9,中间两位任意——仍可部分利用索引(取决于统计信息和优化器判断)。
大小写与空格这些细节别忽略
默认情况下,LIKE是否区分大小写,取决于字段的排序规则(collation)。比如utf8mb4_0900_as_cs是区分大小写的,而utf8mb4_0900_ai_ci不区分。
- 若需强制区分大小写,加
BINARY:例如WHERE name LIKE BINARY 'John%'; - 字段值前后有空格?
' John' NOT LIKE 'John%'——记得用TRIM()预处理或在应用层清洗; -
NULL值永远不匹配任何LIKE模式,查不到就加OR column_name IS NULL显式判断。
想模糊又想快?试试这些替代方案
当LIKE已成性能瓶颈,可考虑更合适的工具:
-
全文索引(FULLTEXT):适合长文本(如文章标题、简介),支持自然语言模式或布尔模式搜索,比
%关键词%快得多; -
内置字符串函数:如
LOCATE('abc', content) > 0或INSTR(content, 'abc'),语义清晰,部分场景执行计划更优; -
正则表达式(REGEXP):功能更强,但开销通常高于
LIKE,仅在复杂模式(如邮箱、手机号校验)时选用。
实战小提醒
写LIKE语句前快速自检:
- 模式里有没有
%放在最前面?如果有,确认数据量和QPS是否允许全表扫描; - 被查字段建了索引吗?前缀匹配才真正受益;
- 是否真需要模糊?有时
=或IN就能解决,别为“看起来像模糊”硬套LIKE; - 用户输入含
%或_怎么办?用ESCAPE指定转义符,例如LIKE '%\%%' ESCAPE '\'查含百分号的记录。











