PostgreSQL 索引,用于像 'abc%' 搜索

Edd*_*die 6 postgresql symfony doctrine-orm doctrine-orm-postgres

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

EXPLAIN SELECT * FROM city WHERE NAME ~~* '???%' 
Seq Scan on city  (cost=0.00..44562.62 rows=117 width=131)
Run Code Online (Sandbox Code Playgroud)

和确切的选择:

EXPLAIN SELECT * FROM city WHERE NAME = '??????' 
Index Scan using city_name_idx on city  (cost=0.43..12.33 rows=2 width=131)
Run Code Online (Sandbox Code Playgroud)

有没有办法使用标准索引在第一次选择时获得良好的性能?

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

Dan*_*ité 10

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

    create index indexname on city (name text_pattern_ops);
    
    Run Code Online (Sandbox Code Playgroud)
  • 为了加速ILIKE~~*,除了LIKE,假设 PostgreSQL 9.1 或更新版本,创建一个这样的索引:

    create index indexname on city  using gin(name gin_trgm_ops);
    
    Run Code Online (Sandbox Code Playgroud)

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