我有一个包含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左右,但我想确保表上的所有搜索都很快。
谢谢!
答案 0 :(得分:3)
“找出经常查询的列集并为它们创建索引”是最好的方法。
此外,根据2个条件对索引中的列进行排序:
where子句优先级较高的列
更具选择性的列具有优先级。
E.g。如果“where col1 = val1”为随机值val1返回平均2行,但“其中col2 = val2”平均返回2000行,col1应该具有优先权,只要在索引的早期
不确定Postgres,但在Sybase中,like '%xxx%'
表达式(例如匹配值以通配符开头)不会命中索引,永远。因此索引无法帮助查询,除非您选择这3列,从而使其成为覆盖索引。
答案 1 :(得分:2)
使用通配符前缀的任何查询过滤条件都不能使用索引[后缀很好,即'abc%']
答案 2 :(得分:1)
如果查询的列在where子句和索引中的顺序相同,PostgreSQL将使用索引。所有10列的索引都可以正常工作。
但是,如果在查询文本的两侧都有通配符匹配,则不会从索引中获益。
如果在用户提供的输入的两侧都需要通配符,那么使用PostgreSQL的全文模块生成索引会更有意义。
http://www.postgresql.org/docs/8.3/static/textsearch.html是一个很好的起点。