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 が緯度と経度としてクエリに渡されます。

これを Navicat で実行すると 2 秒ですが、Cakephp や mysql_query() を使用したスト​​レート php では数分かかります。

なぜこれが発生し、どうすれば修正できますか?

XAMPP を実行している Win7 4GB ボックスで、MySQL と Apache の両方をローカルで実行しています。

4

1 に答える 1

0

これは、テーブル構造に関連している可能性があります。まだ作成していない場合はuser_idplacesテーブルにインデックスを作成することを強くお勧めします。これにより、複雑なクエリの実行時間に驚くべき違いが生じる可能性があります。

また、( distance の) クエリでかなりの量の計算を行っているように見えるため、mysqli または PDO 拡張機能で準備済みステートメント機能を使用すると、古くて低速で安全性の低い機能を使用する代わりに、大きなメリットが得られる可能性があります。非推奨の mysql 拡張機能。

この記事は違いを説明するのに役立ちます: http://php.net/manual/en/mysqli.overview.php

既に mysql 拡張機能に慣れている場合は、mysqli に切り替えることをお勧めします。手続き型の構文/API はほとんど同じです (主な違いは、多くの関数で $connection_handle を最初の引数として指定する必要があることです。オプションの最後の引数です)。

Navicat は準備されたステートメントを利用している可能性があります。それがあなたの違いかもしれません。

于 2012-08-01T02:24:21.657 に答える