类似的PostgreSQL索引';abc%&x27;搜索
我有一个带有城市列表(>1M)的postgreSQL表,我需要按类似“abc%”的模式搜索该表。 我在类似的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
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
,除了~*
,假设PostgreSQL 9.1或更高版本,请创建如下索引:LIKE
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
text\u pattern\u ops
并使用city\u name\u idx在city上进行了索引扫描(cost=0.43..8.45 rows=117 width=131)
。我不能使用ILIKE
或LOWER
,但我可以处理它。谢谢