數據我需要做的自動完成功能,需要做這樣的事情:自動完成正從一個巨大的表
select field from huge_table where field like '%some string%';
表200萬行,我需要從它的快速和若干答覆。 我們正在使用Postgres。這種查詢將會持續下去。
有沒有一種有效的方式來做到這一點與postgres?或者,也許我應該使用除了postgres之外的其他東西?
謝謝!
數據我需要做的自動完成功能,需要做這樣的事情:自動完成正從一個巨大的表
select field from huge_table where field like '%some string%';
表200萬行,我需要從它的快速和若干答覆。 我們正在使用Postgres。這種查詢將會持續下去。
有沒有一種有效的方式來做到這一點與postgres?或者,也許我應該使用除了postgres之外的其他東西?
謝謝!
您可以將索引添加到正在搜索的field
。
而且,如果是可以避免的,不要使用開放式的通配符像%some string%
他們真的傷性能。如果可能的話,做some string%
。
如果你對使用什麼類型的索引更具體一些,也許會很好。只是說:) –
如果你正在做自動完成,我假設你正在尋找基於前綴的匹配。基於前綴的查找的標準數據結構是trie。
如果使用索引和基於前綴的查找(some string%
)無法從postgres獲得足夠的性能,則可以定期對所有200萬行執行完整查詢,然後構建一個trie或與其並行數據庫。
一個特里的最壞的情況下表現O(m)
,其中m
是你的前綴的長度,所以一旦建成,將提供非常快速自動完成。
如果你能負擔得起額外的插入/更新時間也許你可以使用the pg_trgm extension
你必須在鏈接一些測試了一枚200萬條記錄表,看看在最好的情況下改善。
根據您的用例的具體情況,可能值得知道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爲您指數可能會相當大。
您能否獲得頂級的x - 就像是說'TOP 250'還是一個完整結果的有用子集? –
對於自動完成,你可以嘗試http://indexden.com他們有一個很好的API。但是,它是託管解決方案。 –