类似的PostgreSQL索引';abc%&x27;搜索

类似的PostgreSQL索引';abc%&x27;搜索,postgresql,symfony,doctrine-orm,doctrine-orm-postgres,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) 具体选择: EXPLAIN SELECT * FROM city WHERE NAME = 'Москва' Index

我有一个带有城市列表(>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)
具体选择:

EXPLAIN SELECT * FROM city WHERE NAME = 'Москва' 
Index Scan using city_name_idx on city  (cost=0.43..12.33 rows=2 width=131)
是否有任何方法可以使用standart index在first select上实现良好的性能

我使用的是Symfony2/Doctrine2,所以在这里实现特定于数据库的东西并不容易(我也不想这么做)。

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

    create index indexname on city (name text_pattern_ops);
    
    create index indexname on city  using gin(name gin_trgm_ops);
    
  • 若要加速
    ILIKE
    ~*
    ,除了
    LIKE
    ,假设PostgreSQL 9.1或更高版本,请创建如下索引:

    create index indexname on city (name text_pattern_ops);
    
    create index indexname on city  using gin(name gin_trgm_ops);
    
    gin\u trgm\u ops
    由扩展提供,如果数据库中还没有扩展,则应添加该扩展


它看起来像~~*映射到ILIKE,B树索引可能不支持它;用LIKE试试吧。如果数据库区域设置不是“C”,您也可能会遇到问题。有关更多详细信息,请参阅。另请参阅以获取相关讨论。citext(不区分大小写的文本)列类型也有助于ilike搜索。我使用了
text\u pattern\u ops
并使用city\u name\u idx在city上进行了
索引扫描(cost=0.43..8.45 rows=117 width=131)
。我不能使用
ILIKE
LOWER
,但我可以处理它。谢谢