2010-09-01 59 views
1

我有一個簡單的日誌表約50萬行數據,表結構在PostgreSQL如何加快子查詢

TABLE logs 
(
    id serial NOT NULL, 
    username character varying(32), 
    user_id integer, 
    description text NOT NULL, 
    "time" timestamp with time zone DEFAULT now(), 
    referrer character varying(128), 
    "type" character varying(25) 
) 

最常見的操作查詢這個表的描述列的內容條款。典型查詢是...

SELECT username , time , description FROM logs WHERE description ~* 'some text' ORDER by time DESC 

這需要8到20秒的時間,以帶回結果。是否有任何其他方法來優化可以產生更快結果的表或查詢。我在8.2 Portgresql上。

回答

1

您可以創建一個列(布爾),它在插入和更新時通過設置。一個觸發器,這將是可搜索的,但搜索條件將始終是相同的。

您是否考慮過使用Full-text search?您必須在您的postgres版本中手動安裝FTS模塊。

3

首先,您應該升級到8.4以獲得所有新的性能優勢。 8.4已整合tsearch爲full text searching。如果您無法升級,請從contrib安裝Tsearch2

爲了進一步優化,我會創建一個索引time並用它來限制結果。例如。

SELECT username , time , description FROM logs WHERE 
    to_tsvector('english', description) @@ to_tsquery('english', 'some text') 
    AND time > current_timestamp - INTERVAL '1 day' 
    ORDER by time DESC 

查看鏈接的文檔以獲取更多信息。您需要爲to_tsvector創建一個索引,否則全文搜索是無用的。

編輯:如果您的表包含數百萬個數據元組,請考慮使用8.2.3中提供的partitioning重新創建整個表。爲了提高原始速度,請切換到SSD磁盤。有關速度增加的說明,請參見this article