postgres中大型数据库的索引

我在postgres有一张桌子,里面有200万条记录。 我需要提供一些索引,以便like %text%查询like %text%提供良好的性能。

我在某处读到Gin索引适用于%text%搜索,因此尝试了Gin和Gist索引,但不知道为什么没有这样的性能改进,而Gin索引正在使用顺序扫描而不是堆扫描。

这是我的杜松子酒指数:

CREATE INDEX city_gin_idx_name
  ON city
  USING gin
  (to_tsvector('english'::regconfig, lower(name::text)));

查询性能:

“排序(成本= 117553.00..118496.71行= 377482宽度= 50)(实际时间= 1719.660..1745.702行= 35185循环= 1)”“排序键:(concat(name,',',state_name,',', ,country_name))“”排序方法:外部合并磁盘:2200kB“” - > Seq扫描城市(成本= 0.00..56777.75行= 377482宽度= 50)(实际时间= 0.392..1474.559行= 35185循环= 1 )“”Filter:((lower((name):: text)~~'%ed%':: text)OR((city_metaphone):: text ='K':: text))“”Filter by Filter :1851806“”总运行时间: 1764.036 ms“

请告诉我任何适合此要求的索引。


对于该查询,您需要两个索引,并且您需要在查询中使用完全相同的表达式来使用它们:

create index … on city using GIN (to_tsvector('english', name));
create index … on city (city_metaphone);

请注意,在第一个索引中将名称to_tsvector是无用的,因为在计算向量时, to_tsvector无论如何都会忽略该情况。

查询需要如下所示,并且您应该得到一个使用位图索引扫描的计划:

select *
from city
where city_metaphone = 'K'
   or to_tsvector('english', name) @@ to_tsquery('english', 'Katmandu');

话虽如此,我认为你在这里使用全文是错误的。 特别是, '%ed%'表示你希望全文能让你运行某种LIKE比较。

这不是它如何工作,但卦将使它的工作方式:

http://www.postgresql.org/docs/current/static/pgtrgm.html

链接地址: http://www.djcxy.com/p/87225.html

上一篇: indexes for large database in postgres

下一篇: Uniq index on array column in postgres (Rails)