0

我有一个在 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 秒,但在 Cakephp 或使用 mysql_query() 的直接 php 中需要几分钟。

为什么会发生这种情况,我该如何解决?

我在运行 XAMPP 的 Win7 4GB 机器上本地运行 MySQL 和 Apache。

4

1 回答 1

0

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

此外,由于您似乎在查询中进行了大量计算(对于距离),您可能会从使用 mysqli 或 PDO 扩展中的准备好的语句功能中受益匪浅——而不是使用较旧、较慢、不太安全的,不推荐使用 mysql 扩展。

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

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

Navicat 可能正在利用准备好的语句,这可能是你的不同之处。

于 2012-08-01T02:24:21.657 回答