2010-06-08 21 views
1

我在一個有720萬行的表上運行不區分大小寫的搜索,我想知道是否有任何方法可以使這個查詢更快?任何使PostgreSQL計數查詢更快的方法?

目前,只需要一個搜索參數,大約需要11.6秒才能執行,而且我擔心只要添加多個搜索參數,該查詢就會變得非常慢。

SELECT count(*) 
FROM "exif_parse" 
WHERE (description ~* 'canon') 

---編輯---

phpPgAdmin的告訴我,有此列的索引如下定義:

desc_idx CREATE INDEX desc_idx ON exif_parse USING btree (description) 

---編輯2 ----

該數據庫包含這種格式記錄:

imaage_id exif_field description 

並且我將描述作爲搜索運行,因此它包含來自Lens(Pentax-1)的色調曲線(0,0,32,22,64,56,128,128,192,196,255,255) F FISH-EYE 1:3.5-4.5 17-28mm)(佳能EOS REBEL XSi)

+2

FTS? http://www.postgresql.org/docs/8.3/static/textsearch-tables.html – 2010-06-08 19:14:25

+0

通過創建一個特定的索引? – Tarantula 2010-06-08 19:17:40

+0

@OMG小馬:你應該給出這個答案 – araqnid 2010-06-08 19:37:38

回答

4

您應該看看using FTS

+0

你或許有更好的例子嗎?我瀏覽了這篇文檔,做了一些並不真正有用的Google研究。我對PostgreSQL很陌生,來自MySQL。 – 2010-06-09 16:58:30

+0

@Ben Dauphinee:這可能有幫助 - http://linuxgazette.net/164/sephton.html;如有疑問,請查看支持選項 - 有郵件列表和IRC:http://www.postgresql.org/support/ – 2010-06-09 17:56:56

2

你只需創建這樣一個指標:

CREATE INDEX idx_exif_parse_description_vpo 
    ON exif_parse (lower(description) varchar_pattern_ops) 

和下面的查詢將採取毫秒即可完成:

SELECT count(*) 
FROM "exif_parse" 
WHERE (lower(description) LIKE 'canon') 

FTS是矯枉過正的方式爲這個。

+0

這不匹配'canon 5dkmii'的查詢。 – 2012-03-22 21:55:32

+0

正確,匹配那些你只需追加一個通配符,即'LIKE'canon%''。 – sayap 2012-03-23 09:59:32