Postgres中几个varchar列的最佳索引策略

时间:2010-05-07 23:47:53

标签: sql postgresql indexing

我有一个包含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%'

所以我的问题是:我最好用10列创建1个索引吗? 10个索引,每个1列?或者我是否需要找出经常查询的列集并为它们创建索引(在上面的例子中为cols 1,4和8的索引)。

如果我的理解是正确的,那么10列的单个索引只有在所有10列都处于条件状态时才能有效工作。

这里打开任何建议,另外表的行数只能在20-30K左右,但我想确保表上的所有搜索都很快。

谢谢!

3 个答案:

答案 0 :(得分:3)

  1. “找出经常查询的列集并为它们创建索引”是最好的方法。

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

    • where子句优先级较高的列

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

      E.g。如果“where col1 = val1”为随机值val1返回平均2行,但“其中col2 = val2”平均返回2000行,col1应该具有优先权,只要在索引的早期

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

但是,如果在查询文本的两侧都有通配符匹配,则不会从索引中获益。

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

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