#javascript #node.js #knex.js
Вопрос:
У меня есть код этой формулы для вычисления расстояния между двумя точками, но у него проблемы с производительностью.
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')
если я добавлю ограничение — я действительно замечу улучшение, но тогда результаты могут быть неточными. Я не уверен, есть ли способ использовать лак для кэширования результатов — применять грубую силу при вызовах — для первого фрагмента почтовых индексов?
Ответ №1:
Как насчет использования https://postgis.net/docs/ST_Distance.html ? Он должен рассчитать расстояние как можно быстрее.
Однако, если у вас есть огромное количество мест, расстояние до которых используется для заказа результатов, вы можете сначала добавить ограничение, чтобы результаты не включали те места, которые находятся слишком далеко.
Если даже это недостаточно эффективно, возможно, потребуется организовать места в кластеры, а затем сначала следует выбрать только те кластеры, которые находятся достаточно близко для включения, а затем упорядочить места в соответствии с точным расстоянием.