【发布时间】: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 的东西不是很容易(而且我不想)。
【问题讨论】:
-
看起来 ~~* 映射到 B-tree 索引可能不支持的 ILIKE;改用 LIKE 试试。如果您的数据库语言环境不是“C”,您也可能会遇到麻烦。有关详细信息,请参阅postgresql.org/docs/9.2/static/indexes-types.html。另请参阅stackoverflow.com/questions/12126615/… 进行相关讨论。
-
citext(不区分大小写的文本)列类型对于 ilike 搜索也很有帮助。 postgresql.org/docs/9.1/static/citext.html
标签: postgresql symfony doctrine-orm doctrine-orm-postgres