改进/优化MySQL代码

时间:2015-08-06 12:08:37

标签: php mysql

有没有办法优化此代码以更快地运行并且不执行两次相同的操作? (我确实在users.lat和users.lng上设置了索引)

SELECT COUNT(*) AS count FROM users WHERE users.activated = '1' AND users.id != '1'

AND ROUND((DEGREES(ACOS(SIN(RADIANS('$c_lat')) * SIN(RADIANS(users.lat)) + COS(RADIANS('$c_lat')) * COS(RADIANS(users.lat)) * COS(RADIANS('$c_lng' - users.lng))))) * 60 * 1.1515 * 1.60934 * 1000) >= 1000

AND ROUND((DEGREES(ACOS(SIN(RADIANS('$c_lat')) * SIN(RADIANS(users.lat)) + COS(RADIANS('$c_lat')) * COS(RADIANS(users.lat)) * COS(RADIANS('$c_lng' - users.lng))))) * 60 * 1.1515 * 1.60934 * 1000) <= 5000

此代码获取距离$ c_lat 1000米到5000米之间的所有用户的计数以及我在PHP中传递的$ c_lng。

另外,我想避免使用HAVING子句。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用存储过程来保存这些中间值,并避免计算罪和acos两次。

您可以进行一次计算,将值存储在临时变量中并使用它们进行查询。