同样的查询,不同的性能:SQL LIKE 的三种写法详解

1 阅读2分钟

引言

在日常开发中,我们经常需要对数据库进行模糊查询,比如搜索包含某个关键词的记录。在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既准确又高效! 🚀