0

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

SELECT *, (6271 * acos(cos(radians('".$lat."')) * cos(radians(lat)) * cos( radians(long) - radians('".$lng."')) + sin(radians('".$lat."')) * sin(radians(lat)))) AS distance FROM carpark HAVING distance < 15 ORDER BY distance LIMIT 0 , 10";

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

Where ( 6371 * ACOS( COS( RADIANS(".$lat.") ) * COS( RADIANS( grt32sg32u_PostCodeData.lat ) ) * COS( RADIANS(PostCodeData.lon) - RADIANS(".$lon.")) + SIN(RADIANS(".$lat.")) * SIN( RADIANS(PostCodeData.lat)))) <= 15";

那么哪个更快呢?它们的速度是一样的还是有区别的?还有其他方法可以优化此查询吗?

4

1 回答 1

2

我不是地理专家,但如果我们假设您有一个大型数据库,那么您正在对最终距离 > 15 的记录进行大量数学运算。

我不知道哪个(SELECTor 子句中的子句WHERE)更快,但我认为通过限制任一子句返回的结果,您会看到更大的性能提升

你能把它简化成两个查询吗?而不是计算半径,怎么样(下面的伪代码)

where PostCodeData.lat between $lat - radius and $lat + radius

这应该运行得非常快 - 行上没有数学运算,并且 lat 和 lon 可能已被索引。

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

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

在一个不相关但重要的说明中,请检查您的代码是否存在可能的 SQL 注入问题

于 2013-09-23T20:56:59.167 回答