使用Postgres 9.5,我有一个名为
我创建了这个索引:
addresses
的表。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');