【问题标题】:PostgreSQL index for like 'abc%' searching用于类似 'abc%' 搜索的 PostgreSQL 索引
【发布时间】:2015-07-13 18:45:55
【问题描述】:

我有带有城市列表 (>1M) 的 postgreSQL 表,我需要按“abc%”之类的模式搜索该表。 我在city.name 列上创建了 B-tree 索引,这就是我得到的:

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 的东西不是很容易(而且我不想)。

【问题讨论】:

标签: postgresql symfony doctrine-orm doctrine-orm-postgres


【解决方案1】:
  • 要加速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 扩展提供,如果数据库中尚不存在,则应添加该扩展。

【讨论】:

  • 我使用了text_pattern_ops 并得到了Index Scan using city_name_idx on city (cost=0.43..8.45 rows=117 width=131)。我不能使用ILIKELOWER,但我可以处理它。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 2013-04-26
相关资源
最近更新 更多