2013-03-28 32 views
6

數據我需要做的自動完成功能,需要做這樣的事情:自動完成正從一個巨大的表

select field from huge_table where field like '%some string%'; 

表200萬行,我需要從它的快速和若干答覆。 我們正在使用Postgres。這種查詢將會持續下去。

有沒有一種有效的方式來做到這一點與postgres?或者,也許我應該使用除了postgres之外的其他東西?

謝謝!

+0

您能否獲得頂級的x - 就像是說'TOP 250'還是一個完整結果的有用子集? –

+0

對於自動完成,你可以嘗試http://indexden.com他們有一個很好的API。但是,它是託管解決方案。 –

回答

1

您可以將索引添加到正在搜索的field

而且,如果是可以避免的,不要使用開放式的通配符像%some string%他們真的傷性能。如果可能的話,做some string%

+0

如果你對使用什麼類型的索引更具體一些,也許會很好。只是說:) –

2

如果你正在做自動完成,我假設你正在尋找基於前綴的匹配。基於前綴的查找的標準數據結構是trie

如果使用索引和基於前綴的查找(some string%)無法從postgres獲得足夠的性能,則可以定期對所有200萬行執行完整查詢,然後構建一個trie或與其並行數據庫。

一個特里的最壞的情況下表現O(m),其中m是你的前綴的長度,所以一旦建成,將提供非常快速自動完成。

1

如果你能負擔得起額外的插入/更新時間也許你可以使用the pg_trgm extension

你必須在鏈接一些測試了一枚200萬條記錄表,看看在最好的情況下改善。

1

根據您的用例的具體情況,可能值得知道tsquery具有查詢單詞前綴的語法。將此與索引tsvector字段相結合,您可以非常快速地查找單詞前綴。

創建 「龐大」 的表:

CREATE TABLE huge_table (
    field  text, 
    field_tsv tsvector 
); 

添加索引:

CREATE INDEX field_tsv_idx ON huge_table USING gin(field_tsv); 

添加觸發器來更新索引列:

CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE 
ON huge_table FOR EACH ROW EXECUTE PROCEDURE 
tsvector_update_trigger(field_tsv, 'pg_catalog.english', field); 

添加一些模擬數據

INSERT INTO huge_table (field) VALUES ('something nice'); 
INSERT INTO huge_table (field) VALUES ('another thing'); 

然後通過某種限制的查詢前綴:

SELECT field FROM huge_table WHERE field_tsv @@ to_tsquery('anot:*') LIMIT 20; 
    field  
--------------- 
another thing 
(1 row) 

更多的docs特別是對index types爲您指數可能會相當大。