Mysql在select或where子句中使用search/filters语句更快吗?

Mysql在select或where子句中使用search/filters语句更快吗?,mysql,performance,Mysql,Performance,我有一个高级MySQL搜索,它运行基于lat和lon的radius搜索。 上次我构建这样一个系统时,查询速度有很多问题。 我一直在阅读,我注意到有些人会在选择中使用它 SELECT*,(6271*acos(弧度(“$lat.”)*cos(弧度(lat))*cos(弧度(长)-弧度(“$lng.”)+sin(弧度(“$lat.”))* sin(弧度(lat))) 作为距离 从距离小于15的停车场出发,按距离限制0,10“ 或者也可以在where子句中运行它 其中(6371*ACOS(弧度(“.la

我有一个高级MySQL搜索,它运行基于lat和lon的radius搜索。 上次我构建这样一个系统时,查询速度有很多问题。 我一直在阅读,我注意到有些人会在选择中使用它

SELECT*,(6271*acos(弧度(“$lat.”)*cos(弧度(lat))*cos(弧度(长)-弧度(“$lng.”)+sin(弧度(“$lat.”))*
sin(弧度(lat)))
作为距离
从距离小于15的停车场出发,按距离限制0,10“

或者也可以在where子句中运行它

其中(6371*ACOS(弧度(“.lat.”)COS(弧度(grt32sg32u_PostCodeData.lat))
*COS(弧度(PostCodeData.lon)-弧度(“.$lon”)+SIN(弧度(“.$lat.”))

*SIN(RADIANS(PostCodeData.lat))我不是一个地理专家,但如果我们假设你有一个大型ish数据库,你正在对最终距离大于15的记录进行大量计算

我不知道哪一个(在
SELECT
中的子句或
WHERE
中的子句)更快,但我认为通过限制任一子句返回的结果,您将看到更大的性能增益

您能将其简化为两个查询吗?与其计算半径,不如(下面的伪代码)

这应该运行得很快-行上没有数学运算,lat和lon可能都被索引了

然后,您可以对这一行的结果运行radius查询。希望您看到的不是数千行,而是不到十几行

在正方形中搜索点要比在圆形中搜索点快得多。这里的技巧是将搜索范围缩小到最小的封闭正方形,然后使用半径(如果确实需要)消除角点


关于一个不相关但重要的注意事项,请检查您的代码。

是的,我已经阅读了有关此方法的内容,并计划使用它运行。我的lat和lon没有索引。我需要组织此操作。我在将它们作为浮点值运行时遇到了问题。索引lat和lon可能会产生很大的不同。只是这样做了。使用varchar。我相信w作为上次我犯的一个重大错误。MySQL中的Shan-S浮放值有四舍五入的问题,你应该考虑使用数字数据类型,也许是那些把它放在select中的人,WHERE子句需要显示距离,而只把它放在WHERE子句中的人不需要显示它。
where PostCodeData.lat between $lat - radius and $lat + radius