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 需要通读!我建议进入 MySQL 中的EXPLAIN命令以跟踪问题,而不是尝试从 PHP 进行分析。

另请查看使用 EXPLAIN 优化查询

一旦您了解了数据库内部发生的情况,如果需要,调整 PDO 的使用可能会更容易。

于 2012-07-12T15:58:39.737 回答
0

你有没有把“skip_name_resolve”放在 MySQL 中。10-20 秒对我来说听起来像是 DNS。您是在同一台机器上的 PHPMyAdmin - 连接到本地主机吗?而你的PHP使用IP连接?

于 2012-07-12T18:33:12.967 回答