2010-05-07 76 views
4

我有一個需要可搜索的10列的表(該表本身大約有20列)。因此,用戶將至少輸入一個列的查詢條件,但可能全部都是十個。所有非空的條件,然後放入AND條件Postgres中的多個varchar列的最佳索引策略

假設爲列1和column4用戶提供非空標準和column8查詢將是:

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

所以我的問題是:更好的是我關閉創建10列的索引? 10個索引各有1列?或者我需要找出經常一起查詢哪些列,併爲它們創建索引(上述情況下第1,4和8列的索引)。

如果我的理解是正確的,那麼10列的單個索引只有在全部10列處於該條件下才能有效地工作。

打開這裏的任何建議,此外,表的行數只有約20-30K行,但我想確保任何和所有的搜索錶快速。

謝謝!

回答

2
  1. 「找出哪些列頻繁查詢併爲其創建索引」是最好的方法。

    而且,訂購索引列根據2個標準:

    • 列,其在where子句優先

    • 列,其更具有選擇性優先更加頻繁。

      E.g.如果「其中的col1 = VAL1」返回一個隨機值VAL1平均2行,但「其中COL2 = val2的」返回上平均2000行中,col1應優先儘可能在索引

  2. 早期被

    不確定Postgres,但在Sybase中,like '%xxx%'表達式(例如匹配值以通配符開頭)不會觸及索引EVER。因此,索引不能幫助查詢,除非您選擇這3列,從而使其成爲覆蓋索引。

2

與通配符前綴不能利用索引的任何查詢過濾條件[後面添加是細的,即「ABC%」]

1

PostgreSQL將使用索引如果查詢的列是在相同的順序where子句和索引。所有10列的索引都可以正常工作。

但是,如果您在查詢的文本的兩側都有通配符匹配,您將從索引中獲益。

如果您需要在用戶提供的輸入兩側使用通配符,那麼使用PostgreSQL的全文模塊來生成索引會更有意義。

http://www.postgresql.org/docs/8.3/static/textsearch.html是一個很好的開始。