我有这个公式代码来计算两点之间的距离 - 但它有性能问题。
const pharmacy = await knex('place_of_interest')
.select(
knex.raw(
`id, title, line1, line2, county, city, postcode,
(
6371 * acos (
cos ( radians(:lat:) )
* cos( radians( ST_X(coordinate) ) )
* cos( radians( ST_Y(coordinate) ) - radians(:lng:) )
+ sin ( radians(:lat:) )
* sin( radians( ST_X(coordinate) ) )
)
) AS distance`, latLng,
),
)
.andWhere('stock', '>', 0)
.orderBy('distance')
如果我添加限制 - 我确实注意到有所改进,但结果可能不准确。我不确定是否有一种方法可以使用 varnish 来缓存结果 - 对调用进行蛮力 - 对于邮政编码的第一个片段?
答案 0 :(得分:0)
如何使用 https://postgis.net/docs/ST_Distance.html ?它应该尽可能快地进行距离计算。
但是,如果您有大量地点的距离用于对结果进行排序,您可能希望首先添加限制,即结果不应包括那些距离太远的地点。
如果即使这样也没有足够的性能,则可能需要将地方组织成集群,然后应该首先只选择那些足够接近的集群,然后根据确切的距离对位置进行排序。