使用Postgres 9.5,我有一個表addresses
。LIKE查詢的最佳Postgres文本索引?
CREATE TABLE addresses (
id integer PRIMARY KEY,
address text
);
在該表中,我有750萬行。例如:
1, "1600 Pennsylvania Avenue NW, Washington, DC, 20500"
我使用這個表在我的應用程序的自動提示搜索,所以我需要使用這種類型的查詢:
SELECT * FROM addresses WHERE address LIKE '123 Main St%';
我創建這個索引:
CREATE INDEX address_idx ON addresses (address);
但問題是它需要大約1秒,這太慢了。
這裏的查詢計劃:
EXPLAIN SELECT * FROM addresses WHERE address LIKE '123 Main St%';
----
Seq Scan on addresses (cost=0.00..161309.76 rows=740 width=41)
Filter: (address ~~ '123 Main St%'::text)
我試圖創建一些類型的gin
指標,但他們要麼沒有效果或進行的查詢的速度較慢。我不確定我是否正確使用它們。
有關如何創建針對此類查詢進行了優化的索引的任何想法?
編輯
迄今發現的最好的解決辦法是使用文本範圍掃描:
SELECT *
FROM addresses
WHERE address >= '123 Main St' AND
address <= concat('123 Main St', 'z');
這將永遠是一個前綴搜索?然後你可以嘗試'123 Main St'和'123 Main Su'之間的地址。這應該會在索引上產生範圍掃描。 – Thilo
索引應該適用於此查詢。也許與某些文本類型不兼容會阻止使用索引。 –
@Thilo謝謝!使用BETWEEN產生與LIKE查詢相同的結果,並將時間縮短到13ms。要回答你的問題,是的,這將永遠是一個前綴搜索。我不喜歡這種方法的唯一情況是我必須拿出下一個字母或下一個數字,而不是使用通配符。有沒有其他的方式來產生一個範圍掃描,而不必寫這種邏輯? – Tyler