首页 > 解决方案 > 不稳定的 MySQL st_distance_sphere 结果

问题描述

MySQL 在使用时给出的结果st_distance_sphere似乎真的很不稳定。

在用户表上运行此查询:(距点 9.45 公里内的用户列表)

select *, st_distance_sphere(`location`, ST_GeomFromText('point(-74.0104915 45.5576996)')) as distance from `users` having `distance` < 9450

返回正确的结果。

但在查询中从半径中删除 1 米:

select *, st_distance_sphere(`location`, ST_GeomFromText('point(-74.0104915 45.5576996)')) as distance from `users` having `distance` < 9449

给了我这个 SQL 语法错误:#1210 - Incorrect arguments to st_distance_sphere

我还注意到添加一条limit语句会更改查询中断的点,具体取决于限制数。

有人对这种类型的查询有过类似的经历吗?我很难弄清楚这里发生了什么。

我正在使用 MySQL 5.7

谢谢!

编辑: 进一步的测试表明,查询在小集合(<~2-3k 行)上运行良好,但开始突破,非常奇怪。

标签: mysqlsql

解决方案


经过大量测试,我终于找到了不稳定的根源:

单个用户在数据库中的纬度/经度坐标(-100, 100) 无效,可能是因为通过 phpmyadmin 进行了一些人为干预。

纬度应在 -90.0 到 90.0 之间,经度在 -180.0 到 180.0 之间

当该用户最终在我们的搜索范围内时,查询崩溃了。这就是为什么所有参数都会对误差产生影响(极限声明、半径范围和中心点)。一旦用户输入结果,事情就变得疯狂了。

吸取教训,保护您的数据!


推荐阅读