You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化最近点查询:解决PostgreSQL+PostGIS的高成本与重复问题

优化PostGIS邻近公司查询:高效且结果唯一的方案

我们的项目需要分页列出离指定坐标最近的公司,每个公司拥有多个门店,门店地理位置存储在addresses表中。目前基于PostgreSQL 13和PostGIS扩展有两个查询方案:

  • 第一个查询结果符合预期,但查询成本极高(cost=11835.77..11835.82 rows=21 width=137),会消耗大量服务器资源;
  • 第二个查询成本极低(cost=0.57..23.12 rows=21 width=137),但存在多门店公司重复显示的问题。

现寻求优化方案,以获得高效且结果唯一的查询。

高成本但结果正确的查询

SELECT
  "companies"."id",
  "companies"."name",
  MIN(
    ST_Distance(
      addresses.location,
      ST_SetSRID(ST_Point(28.9856799, 41.0842721), 4326)
    )
  ) as distance
from
  "companies"
  left join "branches" on "companies"."id" = "branches"."company_id"
  and "branches"."active" = true
  inner join "addresses" on "branches"."id" = "addresses"."addressable_id"
  and "addresses"."addressable_type" = 'App\Domains\Company\Models\Branch'
where
  "available" = true
group by
  "companies"."id"
order by
  "distance" asc
limit
  21 offset 0;

低成本但结果重复的查询

select
  "companies"."id",
  "companies"."name"
from
  "companies"
  left join "branches" on "branches"."company_id" = "companies"."id"
  left join "addresses" on "addresses"."addressable_id" = "branches"."id"
where
  "addresses"."addressable_type" = 'App\Domains\Company\Models\Branch'
  and "branches"."active" = true
  and "available" = true
order by
  "addresses"."location" <-> ST_SetSRID(ST_Point(28.9856799, 41.0842721), 4326)
limit
  21 offset 0

期望结果

id |      name       
----+-----------------
  1 | Apple
 13 | Volvo
  9 | Burger King
 18 | Sunexpress
 11 | Togg
 19 | MC Donalds
 14 | THY
 16 | Lufthansa
  6 | Migros
  5 | Carrefour
  4 | Starbucks
  3 | Apartment
 10 | Tesla
  2 | Coffee
 17 | Pegasus
 22 | LG
 15 | British Airways
 12 | Volkswagen
 21 | Samsung
 20 | KFC
  7 | Google

内容的提问来源于stack exchange,提问作者Fatih Aytekin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 01:15:42