我有一个在mysql(Navicat)中运行2秒钟的SQL查询,它运行600,000个位置,返回所有表格数据并计算我放入的纬度和长度之间的距离。
SQL是这样的:
select *, 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) -
radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance
FROM places
GROUP BY places.user_id
HAVING distance > 0
ORDER BY distance LIMIT 0 , 10;
在上面的查询中,37和-122作为lat和long传递给查询。
当我在Navicat中运行它时,它是2秒,但是使用mysql_query()在Cakephp或直接php中需要几分钟。
为什么会发生这种情况,我该如何解决?
我在运行XAMPP的Win7 4GB机箱上本地运行MySQL和Apache。
答案 0 :(得分:0)
这可能与您的表结构有关。如果您还没有,我强烈建议您在user_id
表格中的places
上创建索引。这可以使复杂查询的执行时间产生惊人的差异。
此外,由于您似乎在查询(距离)中进行了大量计算,因此您可以从使用mysqli或PDO扩展中的预准备语句功能中获益,而不是使用较旧的,较慢的,较少的-safe,不推荐使用mysql扩展。
本文有助于解释差异:http://php.net/manual/en/mysqli.overview.php
如果您已经习惯了mysql扩展,我建议切换到mysqli - 它们的过程语法/ API几乎完全相同(主要区别在于您需要提供$ connection_handle作为许多函数中的第一个参数,而不是它是可选的最终参数。)
Navicat可能正在利用准备好的陈述,这可能是你的不同。