2016-07-26 44 views
0

我不明白爲什麼我的查詢正在執行順序掃描。Postgresql不使用我的索引

select columns 
from table 
where (column_1 ilike '%whatever%' or column_2 ilike '%whatever%') 

我在column_1和column_2上都有一個索引。

兩列的基數都很高。

我的表格大約有2500萬行。

您認爲我可能會做錯什麼?無論我做什麼,它總是進行順序掃描。

編輯#1: 我的指標是這樣的:

Create index xxx on table (column_1, column_2); 

編輯#2: 更改我的SQL查詢來

select columns 
from table 
where (column_1 ilike 'whatever%' and column_2 ilike 'whatever%') 

仍然取得了我的查詢使用順序掃描。當我剛剛使用like而不是ilike時,我得到了相同的結果。但此查詢:

select columns 
from table 
where (column_1 = 'whatever' and column_2 = whatever) 

使我的查詢使用索引掃描和我的查詢就快得多:)

+0

請參閱:http://dba.stackexchange.com/q/144899/1822 –

回答

2

兩個原因:

  • 你的查詢做了一個OR條件,其中索引可以」不要使用。
  • 您正在對「%xyz%」進行類似操作。這不能使用任何排序(即索引)數據的幫助。

-

編輯:看看你是否可以有 「某某%」 like。然後,如果您在兩個列上都執行單獨的條件(以及兩者上的單獨索引),則可以使用索引

編輯2:通過查詢,您嘗試執行的操作看起來像全文搜索。爲此,您需要使用搜索索引技術(Read Elasticsearch,Sphinx,Solr)

+0

您是否可以編輯您的文章並在您說時更具體在兩列上做一個單獨的條件? – LunchBox

+0

你可以修改你的條件來做一個'喜歡'的條件,如上所述.. –

+0

完成,我編輯我的帖子,包括我的結果。 – LunchBox