6

我有带有城市列表(> 1M)的postgreSQL表,我需要通过像'abc%'这样的模式来搜索这个表。我在列上创建了 B 树索引city.name,这就是我得到的:

EXPLAIN SELECT * FROM city WHERE NAME ~~* 'Мос%' 
Seq Scan on city  (cost=0.00..44562.62 rows=117 width=131)

以及确切的选择:

EXPLAIN SELECT * FROM city WHERE NAME = 'Москва' 
Index Scan using city_name_idx on city  (cost=0.43..12.33 rows=2 width=131)

有什么方法可以使用标准索引在第一次选择时获得良好的性能?

我正在使用 Symfony2/Doctrine2,所以在这里实现特定于 db 的东西并不是很容易(而且我不想)。

4

1 回答 1

10
  • 要加快速度LIKE(区分大小写),请创建如下索引:

    create index indexname on city (name text_pattern_ops);
    
  • 为了加快ILIKE~~*,除了LIKE,假设 PostgreSQL 9.1 或更高版本,创建一个像这样的索引:

    create index indexname on city  using gin(name gin_trgm_ops);
    

    gin_trgm_opspg_trgm扩展提供,如果数据库中尚不存在,则应添加该扩展。

于 2015-07-13T21:00:39.540 回答