MySQL空间查询,以查找传递到设置点的所有行

MySQL空间查询,以查找传递到设置点的所有行,mysql,geospatial,spatial-query,spatial-index,point-in-polygon,Mysql,Geospatial,Spatial Query,Spatial Index,Point In Polygon,我有一张表,商店,有数千家商店提供服务。如果我有每个门店的lat、lng和delivery\u radius(我可以添加一个点列),那么查询表以查看哪些门店可以送货到我当前所在的位置的最有效方法是什么 我觉得检查我与每一行之间的距离是否小于交付半径将是一个非常漫长的过程。是否最好添加一列来存储根据每行信息计算的多边形,并查看我的当前点是否在该多边形中(多边形中的点)?还有其他建议吗?您可以在SQL查询中使用以下代码段获得两个地理点之间的距离 ROUND((3959 * acos(cos(radi

我有一张表,
商店
,有数千家商店提供服务。如果我有每个门店的
lat
lng
delivery\u radius
(我可以添加一个
列),那么查询表以查看哪些门店可以送货到我当前所在的位置的最有效方法是什么


我觉得检查我与每一行之间的距离是否小于
交付半径
将是一个非常漫长的过程。是否最好添加一列来存储根据每行信息计算的多边形,并查看我的当前点是否在该多边形中(多边形中的点)?还有其他建议吗?

您可以在SQL查询中使用以下代码段获得两个地理点之间的距离

ROUND((3959 * acos(cos(radians(IFNULL(P1.LAT, 0))) * cos(radians(IFNULL(P2.LAT, 0))) * cos(radians(IFNULL(P2.LNG, 0)) - radians(IFNULL(P1.LNG, 0))) + sin(radians(IFNULL(P1.LAT, 0))) * sin(radians(IFNULL(P2.LAT, 0))))),3) AS DISTANCE
但是,这是一项非常昂贵的操作,当数据增长时,您肯定会遇到性能问题。维护多边形也可能很困难,因为您必须为每个新添加的存储更新多边形,并且当数据增长时,更新过程将以指数速度减慢


如果在RDBS上不需要这样做,请考虑使用像弹性搜索这样的其他技术来支持这种操作。请参考

我想你可能误解了多边形。这不是包含所有存储的单个多边形。这将是为每个商店保存的多边形。这样,我的当前位置可以与该多边形进行比较。我的理论是,这消除了为每个商店创建“可用区域”的计算。这会改变你对它的看法吗?肯定是在研究elasticsearch。实际上我不太理解你提到的多边形概念。澄清一下,你的位置是动态的还是静态的?添加新店后,多边形如何受到影响?是否要求确定可交付到您当前位置的门店列表?多边形如何通过添加新店解决此问题?我的位置是动态的,它将根据我的位置创建。我指的多边形概念是多边形中的一个点。我的当前位置是一个点,但我可以将每个商店的配送半径保存为多边形。通过查看我的当前点是否在每个商店的多边形中而不是计算每个点之间的距离并查看其是否小于或等于半径来搜索是否更快?好的,我仍然对你的多边形想法感到困惑。因为当您更改位置时,搜索结果应该更改。例如,当您将位置从X更改为Y时,适用商店的数量应随您行驶的距离而变化。以前不受欢迎的商店的子集可能会有一些更接近。我仍然不确定如何使用static set,我仍然觉得要么你必须更改多边形,要么动态计算距离,并在位置更改时过滤范围内的存储。有时我可能没有正确理解这个要求。