【问题标题】:Best indexing strategy for several varchar columns in PostgresPostgres 中几个 varchar 列的最佳索引策略
【发布时间】:2010-05-07 23:47:53
【问题描述】:

我有一个需要搜索的包含 10 列的表(表本身大约有 20 列)。因此,用户将输入至少一列但可能全部十列的查询条件。然后将所有非空条件放入 AND 条件

假设用户为 column1 和 column4 和 column8 提供了非空条件,则查询将是:

select * from the_table 
where column1 like '%column1_query%' 
and column4 like '%column4_query%'
and column8 like '%column8_query%'

所以我的问题是:创建 1 个包含 10 列的索引是否更好? 10 个索引,每个索引 1 列?或者我是否需要找出经常一起查询哪些列集并为它们创建索引(在上例中为列 1,4 和 8 上的索引)。

如果我的理解是正确的,10 列的单个索引只有在所有 10 列都符合条件时才有效。

欢迎在这里提出任何建议,此外,表格的行数预计仅为 20-30K 行左右,但我想确保表格上的所有搜索都很快。

谢谢!

【问题讨论】:

    标签: sql postgresql indexing


    【解决方案1】:
    1. “找出经常一起查询哪些列集并为它们创建索引”是最好的方法。

      此外,根据 2 个标准对索引中的列进行排序:

      • where 子句中出现频率较高的列具有优先级

      • 更具选择性的列具有优先权。

        例如如果 "where col1=val1" 为随机值 val1 返回 2 行的平均值,但 "where col2=val2" 平均返回 2000 行,则 col1 应优先于索引的早期

    2. 不确定 Postgres,但在 Sybase 中,like '%xxx%' 表达式(例如,匹配值以通配符开头)永远不会命中索引。因此,除非您选择这 3 列并使其成为覆盖索引,否则该索引无法帮助该查询。

    【讨论】:

      【解决方案2】:

      任何以通配符为前缀的查询过滤条件都不能使用索引[后缀很好,即'abc%']

      【讨论】:

        【解决方案3】:

        如果查询的列在 where 子句和索引中的顺序相同,PostgreSQL 将使用索引。所有 10 列的索引都可以正常工作。

        但是,如果您在查询文本的两边都有通配符匹配,您将不会从索引中获得任何好处。

        如果您在用户提供的输入的两边都需要通配符,那么使用 PostgreSQL 的全文模块来生成索引会更有意义。

        http://www.postgresql.org/docs/8.3/static/textsearch.html 是一个很好的起点。

        【讨论】:

          猜你喜欢
          • 2021-02-07
          • 1970-01-01
          • 1970-01-01
          • 2013-07-15
          • 2014-04-02
          • 1970-01-01
          • 2017-10-03
          • 2010-10-25
          • 1970-01-01
          相关资源
          最近更新 更多