以下查询使用索引进行了优化。在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 scrip:
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);
答案 0 :(得分:2)
这是要阅读的大量SQL!我建议进入MySQL中的EXPLAIN命令来追踪问题,而不是试图从PHP中进行分析。
另请查看Optimizing Queries with EXPLAIN。
一旦了解了数据库内部的情况,如果需要,可能更容易调整PDO用法。
答案 1 :(得分:1)
你在MySQL中放了“skip_name_resolve”吗? 10-20秒对我来说听起来像DNS。你是PHPMyAdmin在同一台机器上 - 连接到localhost?你使用IP连接PHP吗?