1. 百分号%
内部工作原理:
- 代表零个、一个或多个任意字符。
LIKE 'A%'
:MySQL会从索引(如果存在)中查找所有以 “A” 开头的记录。如果没有索引,则需要扫描整个表。- MySQL解析器将模式转换为可执行的形式,并利用索引来加速匹配过程(如果有合适的索引)。
性能影响与优化:
- 索引:为了提高查询效率,可以在经常用于模式匹配的列上创建索引。例如,对于
username LIKE 'A%'
,可以在username
列上创建前缀索引。 - 避免全表扫描:尽量不要在模式的开头使用通配符,因为这会导致MySQL无法利用索引而进行全表扫描。
示例与应用场景:
-
前缀匹配:查找以特定字符串开头的所有记录。
SELECT * FROM users WHERE username LIKE 'A%';
这条语句会返回所有以字母 “A” 开头的用户名。
-
后缀匹配:查找以特定字符串结尾的所有记录。
SELECT * FROM emails WHERE email LIKE '%@example.com';
这条语句会返回所有电子邮件地址以
@example.com
结尾的用户。 -
中间匹配:查找包含特定子串的所有记录。
SELECT * FROM products WHERE description LIKE '%shirt%';
这条语句会返回描述中包含单词 “shirt” 的所有产品。
注意事项:
- 使用
%
可能导致全表扫描,尤其是在没有适当索引的情况下,这可能会影响性能。 - 如果查询条件非常宽松(如
LIKE '%'
),将返回所有记录,相当于SELECT * FROM table
。
高级用法:
- 组合通配符:可以结合多个通配符来构建更复杂的模式。例如,
LIKE 'A%B%'
匹配以 “A” 开头并包含 “B” 的字符串。 - 转义字符:当需要匹配实际的百分号时,使用转义字符。例如,
LIKE '100%' ESCAPE ''
将匹配包含 “100%” 的字符串。
2. 下划线_
内部工作原理:
- 每个下划线代表一个任意字符的位置,因此
LIKE 'J_n'
会查找以 “J” 开头,后面跟任意单个字符,然后是 “n” 的记录。 - 下划线的行为类似于正则表达式中的点号
.
,但它仅匹配单个字符。
性能影响与优化:
- 索引利用:虽然
_
只匹配单个字符,但在某些情况下仍然可以利用索引。例如,LIKE '_a%'
可以部分利用索引。 - 限制使用:尽量减少下划线的数量,因为过多的下划线可能导致索引失效。