【问题标题】:Performance of querying for a string that starts and ends with something查询以某事开头和结尾的字符串的性能
【发布时间】:2021-10-20 18:21:19
【问题描述】:

在数据库中查询以某字开头和以某字结尾的某些字符列是否存在性能差异?

SELECT * FROM table WHERE column like '%something'
SELECT * FROM table WHERE column like 'something%'

选择一种方法而不是另一种方法有什么缺点吗?忽略用户需要匹配单词的开头或结尾。
它的实现方式可能算法在某些方面有所不同?

【问题讨论】:

    标签: sql performance algorithm


    【解决方案1】:

    SQL 优化器将在第二个示例中查找列上的索引,并将其缩小到以通配符之前的字符开头的记录。在第一个示例中,它无法缩小范围,因此您希望扫描索引或表(取决于索引结构)。

    您使用的是哪种 SQL 产品?

    【讨论】:

    • 你这样做了,我添加了 postgresql 作为标签。每个 SQL 版本都有自己的优化器,虽然我不能专门针对 Postgresql,但如果列上有索引,大多数 SQL 优化器都会像我描述的那样运行......
    【解决方案2】:

    如果您按字母索引,第二个会更快。否则我想他们会是一样的。

    【讨论】:

    • 我如何按字母顺序索引我的数据库?仅在 char 列中执行重新索引就足够了?
    • 这样的:CREATE INDEX your_index_name ON your_table_name (your_column_name)
    • 默认情况下,postgres 创建一个b-tree index,这对大多数字母数字搜索操作都有好处。
    • 没问题。如果它解决了您的问题,请确保接受它。另外,如果您需要其他参考,postgresql.org/docs/8.3/static/indexes-types.html
    【解决方案3】:

    另外说明,如果你真的需要支持%something

    你可以添加一个字符串反转的新列,然后在列的反面创建一个索引,所以它变成gnihtemos

    现在,如果您在开头检测到通配符,请反转搜索字符串并搜索反转列而不是主列。您将获得索引的速度优势,但需要额外的代码来保持反向列同步...

    【讨论】:

      【解决方案4】:

      而不是创建一个新的列和索引来处理

      SELECT * FROM table WHERE column like '%something'
      

      查询,你可以创建一个索引

      CREATE INDEX rev_col_idx ON table (reverse(column) text_pattern_ops);
      

      然后将上面的查询改写为

      SELECT * FROM table WHERE reverse(column) like reverse('%something')
      

      这将达到同样的效果。

      【讨论】:

        猜你喜欢
        • 2017-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多