2

次のクエリは、インデックスを使用して最適化されています。時間は、PHP 内でのクエリ実行の前後で正確に測定され、10 秒または 20 秒かかる場合があります。行数が10未満の場合があり、それでもクエリの実行が遅くなるため、行数に依存していないようです。以下に示すクエリの実行を除いて、PHP は他の操作を行いません。

SELECT * FROM (
  SELECT o.op AS orid,
  (3959 * acos(cos(radians(59.4369583424862))
  * cos(radians(d.latitude)) * cos( radians( d.longitude) -
  radians(24.7535276412964)) + sin(radians(59.4369583424862))
  * sin( radians( d.latitude ) ) ) ) AS distance
  FROM (
  SELECT * FROM d WHERE
    d.type='rdw' AND d.longitude > 24.4837311595 AND
    d.longitude < 25.0233241231 AND d.latitude > 59.1671618607 AND
    d.latitude < 59.7067548243
  ) AS d
  LEFT JOIN o ON d.destinid = o.destinid
  LEFT JOIN op ON o.operatorid = op.operatorid
  having distance < 30
  ORDER BY distance
) AS t
GROUP BY trajectoperatorid
LIMIT 0, 30

クエリの実行方法は次のとおりです。

$stmt = $pdo->prepare($sql1);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); //foreach($rows as $row){

データベースへの接続は、最初の測定の前にすでに存在していました。

SQL_NO_CACHE を使用して phpmyadmin で同じクエリを実行すると、一貫してわずか 0.06 秒しかかかりません。PHP スクリプト内で実行すると、まったく同じクエリが遅くなるのはなぜですか?

以下はphpスクリプトです。

write_log_file('Start query'.date('l jS \of F Y h:i:s') . substr((string)microtime(), 1, 8));

$sql1 = "
SELECT * FROM (
  SELECT o.op AS orid,
  (3959 * acos(cos(radians(59.4369583424862))
  * cos(radians(d.latitude)) * cos( radians( d.longitude) -
  radians(24.7535276412964)) + sin(radians(59.4369583424862))
  * sin( radians( d.latitude ) ) ) ) AS distance
  FROM (
  SELECT * FROM d WHERE
    d.type='rdw' AND d.longitude > 24.4837311595 AND
    d.longitude < 25.0233241231 AND d.latitude > 59.1671618607 AND
    d.latitude < 59.7067548243
  ) AS d
  LEFT JOIN o ON d.destinid = o.destinid
  LEFT JOIN op ON o.operatorid = op.operatorid
  having distance < 30
  ORDER BY distance
) AS t
GROUP BY trajectoperatorid
LIMIT 0, 30";

$stmt = $pdo->prepare($sql1);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
4

2 に答える 2

1

それは読むべきSQLがたくさんあります! PHP からプロファイリングするのではなく、MySQL でEXPLAINコマンドを使用して問題を追跡することをお勧めします。

EXPLAIN を使用したクエリの最適化もご覧ください。

データベース内で何が起こっているかを理解すれば、必要に応じて PDO の使用法を微調整するのが簡単になるでしょう。

于 2012-07-12T15:58:39.737 に答える
0

MySQLに「skip_name_resolve」を入れましたか。10〜20秒は私にはDNSのように聞こえます。同じマシン上のPHPMyAdminですか?ローカルホストに接続していますか?そして、あなたはIP接続を使用してPHPを使用していますか?

于 2012-07-12T18:33:12.967 に答える