postgresql - 加快 PostgreSQL 中名称匹配的查询
问题描述
我正在尝试使用 mio 在大型地址表中进行名称搜索。的行。我有一个表地址和一个表管理员,可以找到从 1 级到 4 级的坐标。每当我在地址表中的地址字段中找到所有行政级别时,我想用管理表中的坐标更新地址表中的坐标。我也想为不同的行政级别组合做到这一点。例如,我创建了一个表 admin1_2 或 admin1_3,其中仅显示管理级别 1 和 2 或 1 和 3。为了确保每个管理员对都有唯一的坐标,我计算了所考虑的各个管理员级别的平均坐标。我想逐步实现匹配,从所有管理员级别开始,
问题是查询很慢。所有管理员级别需要超过 24 小时,而 3 个级别需要大约相同的时间。鉴于我有一堆不同的组合,这将需要很长时间。我试图适当地索引列,但没有足够的知识来理解查询计划以及如何使查询更快。任何帮助表示赞赏。请参阅下面的代码和查询计划。
create index country_idx on adress(country);
create index address_idx on address using GIN (address_field gin_trgm_ops);
update address t1 set
admin1 = t.admin1,
admin2 = t.admin2,
admin3 = t.admin3,
admin4 = t.admin4
postal_code = t.postal_code,
lat = t.lat,
lng = t.lng from (
select * from admin) t
where t1.country = t.country
and t1.address_field like '%' || t.admin1 || '%' --looks whether city name from admin shows up in address_field in t1
and t1.address_field like '%' || t.admin2 || '%'
and t1.address_field like '%' || t.admin3 || '%'
and t1.address_field like '%' || t.admin4 || '%'
;
Update on address t1 (cost=0.17..4069793.89 rows=134 width=203)"
-> Nested Loop (cost=0.17..4069793.89 rows=134 width=203)"
-> Seq Scan on admin (cost=0.00..24314.49 rows=958249 width=81)"
-> Bitmap Heap Scan on address t1 (cost=0.17..4.21 rows=1 width=73)"
Recheck Cond: ((address_field ~~ (('%'::text || admin.admin1) || '%'::text)) AND (address_field ~~ (('%'::text || admin.admin2) || '%'::text)) AND (address_field ~~ (('%'::text || admin.admin3) || '%'::text)) AND (address_field ~~ (('%'::text || admin.admin4) || '%'::text)))"
Filter: (admin.country = country_)"
-> Bitmap Index Scan on address_idx (cost=0.00..0.17 rows=1 width=0)"
Index Cond: ((address_field ~~ (('%'::text || admin.admin1) || '%'::text)) AND (address_field ~~ (('%'::text || admin.admin2) || '%'::text)) AND (address_field ~~ (('%'::text || admin.admin3) || '%'::text)) AND (address_field ~~ (('%'::text || admin.admin4) || '%'::text)))"
编辑:管理字段使用 GIN 索引进行索引。我无法提高性能。有什么进一步的建议吗?
解决方案
推荐阅读
- laravel - 无法在 laravel 中更新 Vue 模板
- android - Google Cloud 应用程序 -Android- 对 API 密钥的限制不起作用
- ios - 禁止空输入
- vue.js - 除非我清除 .cache 文件夹,否则首次构建后 Vue CLI 子编译失败
- javascript - 使用 Javascript / lodash 重新排列对象的位置
- ruby-on-rails - 搜索具有日期范围的对象
- javascript - 如何使用 Javascript 和 PHP 格式化日期时间戳
- android - 如何使用没有黑色背景的透明 Webm
- spring-boot - @DataJpaTest 忽略 `spring.datasource.url` 配置。怎么修?
- pipelinedb - PipelineDBarrival_timestamp 字段不出现