Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的查询在PHP中速度慢而在PHPMYadmin中速度快?_Php_Mysql_Pdo - Fatal编程技术网

为什么我的查询在PHP中速度慢而在PHPMYadmin中速度快?

为什么我的查询在PHP中速度慢而在PHPMYadmin中速度快?,php,mysql,pdo,Php,Mysql,Pdo,下面的查询使用索引进行了优化。时间是在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) -

下面的查询使用索引进行了优化。时间是在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
在第一次测量之前,已存在与数据的连接

在phpmyadmin中使用SQL\u NO\u缓存运行同一查询时,始终只需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);

要通读的SQL太多了!我建议使用MySQL中的命令来跟踪问题,而不是尝试从PHP中分析

也来看看


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

您是否在MySQL中添加了skip_name_resolve。10-20秒对我来说听起来像DNS。您是否在同一台计算机上连接到本地主机?您是否使用IP连接?

在$stmt->execute之后进行测量;或者在$rows=$stmt->fetchAll之后?当您在phpAdmin中运行查询时,phpAdmin是否会更改它?有时,当我运行查询时,它会改变它们,我假设是为了优化它们,您是如何在phpDesN中获得执行时间的,不是phpMyAdmin添加限制0,30吗?这听起来可能很奇怪,但您是否连接到本地主机?如果是这样,请确保以127.0.0.1连接到数据库,而不是本地主机。相信我,这是有区别的。从数据库来看,这很好,这就是问题解释在这两种情况下都是一样的?据我所知,完全相同的查询从phpmyadmin开始的速度非常快。好吧,也许完全相同的查询在PDO中的运行方式会根据配置的不同而有所不同。最好的办法是尽快找到答案,问问MySQL。甚至可能值得通过PHPMyAdmin运行EXPLAIN。也就是说,谁知道PHPMyAdmin使用的是哪个MySQL库,只是b/c它是PHP并不意味着它是PDO。@gmm不是为了建立数据库连接而跳过名称解析吗?连接已建立,超出时间测量范围。我建立了一次连接,然后做了几个查询。
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);