引言
在日常开发中,我们经常需要对数据库进行模糊查询,比如搜索包含某个关键词的记录。在SQL中,LIKE
配合通配符%
可以实现这一功能,但不同的%
位置会导致完全不同的查询逻辑。
你是否遇到过这样的问题:
- 为什么
Contains("abc")
能搜到"123abc456"
,但StartsWith("abc")
却搜不到? LIKE '%abc'
和LIKE 'abc%'
查询性能有差异吗?- 如何优化模糊查询,避免全表扫描?
今天,我们就来彻底搞懂SQL模糊查询的三种模式:'%abc%'
、'%abc'
、'abc%'
,并分析它们的应用场景和性能影响。
1. '%abc%'
(前后都有%
)—— 包含匹配
LINQ写法
query.Where(x => x.Title.Contains("abc"))
SQL转换
WHERE Title LIKE '%abc%'
匹配规则
只要字段中包含"abc"
,无论它在开头、中间还是结尾,都会被匹配。
示例匹配值:
"abc"
"123abc"
"abc456"
"123abc456"
适用场景:
- 全局搜索(如电商网站的商品关键词搜索)
- 需要查找任意位置包含目标字符串的记录
性能注意:
- 无法使用索引(因为
%
在前),数据量大时可能较慢。
2. 'abc%'
(仅后面有%
)—— 开头匹配
LINQ写法
query.Where(x => x.Title.StartsWith("abc"))
SQL转换
WHERE Title LIKE 'abc%'
匹配规则
仅匹配以"abc"
开头的字符串。
示例匹配值:
"abc"
"abc123"
"abcdef"
- 不匹配
"123abc"
(因为不是以"abc"
开头)
适用场景:
- 搜索前缀(如用户名、订单号等固定前缀的数据)
- 支持索引优化(比
'%abc%'
更快)
3. '%abc'
(仅前面有%
)—— 结尾匹配
LINQ写法
query.Where(x => x.Title.EndsWith("abc"))
SQL转换
WHERE Title LIKE '%abc'
匹配规则
仅匹配以"abc"
结尾的字符串。
示例匹配值:
"abc"
"123abc"
"xyzabc"
- 不匹配
"abc123"
(因为不是以"abc"
结尾)
适用场景:
- 搜索后缀(如文件扩展名
.txt
、邮箱域名@gmail.com
等) - 无法使用索引(
%
在前),大数据量时查询较慢
4. 性能对比与优化建议
查询方式 | 索引利用 | 适用场景 | 优化建议 |
---|---|---|---|
'%abc%' | ❌ 无法使用 | 全局模糊搜索(如搜索引擎) | 避免大数据量使用,考虑全文索引(如FULLTEXT ) |
'abc%' | ✅ 可以使用 | 前缀匹配(如用户名、订单号) | 适合高频查询,优先使用 |
'%abc' | ❌ 无法使用 | 后缀匹配(如文件类型) | 数据量大时可考虑反向存储+'cba%' 查询 |
优化技巧:
- 如果经常使用
EndsWith
,可以存储反转字符串并配合StartsWith
查询(如存储"cba"
,查询LIKE 'cba%'
)。 - 大数据量模糊查询考虑使用Elasticsearch等全文搜索引擎。
5. 总结
'%abc%'
→ 包含匹配(Contains
),但性能较差。'abc%'
→ 开头匹配(StartsWith
),能利用索引,查询高效。'%abc'
→ 结尾匹配(EndsWith
),无法走索引,大数据量慎用。
正确选择模糊查询方式,能让你的SQL既准确又高效! 🚀