MySQL与PHP查询性能问题

时间:2012-07-31 21:33:07

标签: php mysql sql performance cakephp

我有一个在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。

1 个答案:

答案 0 :(得分:0)

这可能与您的表结构有关。如果您还没有,我强烈建议您在user_id表格中的places上创建索引。这可以使复杂查询的执行时间产生惊人的差异。

此外,由于您似乎在查询(距离)中进行了大量计算,因此您可以从使用mysqli或PDO扩展中的预准备语句功能中获益,而不是使用较旧的,较慢的,较少的-safe,不推荐使用mysql扩展。

本文有助于解释差异:http://php.net/manual/en/mysqli.overview.php

如果您已经习惯了mysql扩展,我建议切换到mysqli - 它们的过程语法/ API几乎完全相同(主要区别在于您需要提供$ connection_handle作为许多函数中的第一个参数,而不是它是可选的最终参数。)

Navicat可能正在利用准备好的陈述,这可能是你的不同。