暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

程序员极光 2025-05-16
110

引言

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


              最后修改时间:2025-06-18 15:32:37
              文章转载自程序员极光,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论