LIKE前缀模糊查询的正确写法是LIKE 'abc%',能走索引的前提是字段有B+树索引、无隐式转换、未被函数包裹;而LIKE '%abc'或'%abc%'必然全表扫描,应改用反向索引或FULLTEXT。

LIKE前缀模糊查询的正确写法
直接用 LIKE 'abc%' 就是标准的前缀匹配,它能走索引(前提是字段有索引且未被函数包裹),性能通常没问题。关键不是“怎么写”,而是“怎么别写错”。
为什么有时候LIKE不走索引?
常见原因不是语法错,而是隐式类型转换或表达式干扰:
-
WHERE CAST(name AS CHAR) LIKE 'abc%':强制转换让优化器放弃索引 -
WHERE UPPER(name) LIKE 'ABC%':函数作用于列,索引失效 -
WHERE name LIKE CONCAT('%', 'abc'):通配符在左边,变成全表扫描 - 字段是
TEXT类型且没建前缀索引,MySQL 5.7+ 对长文本可能跳过索引
区分大小写的前缀匹配要注意什么?
MySQL 默认不区分大小写(取决于列的 collation),如果需要严格匹配,不能只靠 LIKE:
- 用
BINARY强制区分:WHERE BINARY name LIKE 'Abc%' - 或改用
=+SUBSTRING()组合:WHERE SUBSTRING(name, 1, 3) = 'Abc'(更可控,也更容易利用索引) - 注意
BINARY是操作符不是函数,不能加括号写成BINARY(name)
PostgreSQL 或 SQLite 下的等效写法
它们行为略有不同,容易踩坑:
- PostgreSQL 中
LIKE默认区分大小写,要不区分得用ILIKE;但ILIKE基本无法走索引,建议用lower(name) LIKE lower('Abc%')+ 函数索引 - SQLite 的
LIKE总是不区分大小写,且不支持反斜杠转义(\_无效),要用ESCAPE ''指定自定义转义符 - 所有数据库中,想查字面量
%或_,必须显式声明ESCAPE,例如:WHERE tag LIKE '100\%' ESCAPE '\'
真正影响精度的往往不是 LIKE 本身,而是字符集、collation、索引定义和前后空格——比如 'abc ' 和 'abc' 在 CHAR 字段里可能等价,但在 VARCHAR 里就不是。


















