【问题标题】:PDO - a specific query is drastically slow compared to manual executionPDO - 与手动执行相比,特定查询非常慢
【发布时间】:2016-06-19 09:34:44
【问题描述】:

我在使用特定查询时遇到了非常缓慢的查询执行(写在下面)。

奇怪的是,当手动运行查询时(使用 phpMyAdmin),只需要一秒钟即可完成,而从 PHP 和 PDO 运行它,则需要 几乎 10 分钟!

其他查询正常执行(PDO 和 phpMyAdmin 之间的持续时间相等)。

技术细节:

  • 我正在使用 Google 的 AppEngine 和 Cloud SQL。
  • 运行 PHP5.5
  • 执行 php 代码的应用引擎实例不忙。
  • 大约 10,000 行的查询结果

我正在运行的查询:

SELECT s.saleID,s.year,s.kilometrage,s.hand,s.price,s.pictures,u.platform,s.date,
   (SELECT AVG(price) FROM sales s2 WHERE s2.carID = s.carID AND s2.year = s.year HAVING COUNT(s2.saleID)>5) AS avgPrice
   FROM sales s JOIN users u ON u.ID = s.sellerID LEFT JOIN sold so ON s.saleID = so.saleID WHERE so.saleID IS NULL

关于这个问题的任何提示?它不能与索引相关,因为查询在 phpMyAdmin 下运行良好。

编辑

如果有人也有这种情况 - 似乎 PMA 在分页查询上添加了一个隐式 LIMIT,这使得在某些情况下一切运行得更快。

【问题讨论】:

  • 我在一个查询中遇到了同样的问题。我唯一的猜测是它与我所做的连接有关。如果我删除其中一个,即使通过 Pdo 也可以正常工作
  • 但是为什么只有通过 PDO 执行 JOIN 才会减慢查询速度?我的意思是,如果查询很慢,那么在 PDO 和 phpMyAdmin 上都应该很慢。
  • 这点我还不明白。我在这里的一个未回答的问题中问了同样的问题
  • This answer 可能会有所帮助。有一个 PDO EXPLAIN 命令可以查看规划器在做什么。还有索引提示告诉它如何运行。另请参阅the answer below that about type casting

标签: php mysql pdo


【解决方案1】:

尝试在字段列表中编写不带子查询的查询。像这样的:

SELECT s.saleID, s.year, s.kilometrage, s.hand, 
   s.price, s.pictures, u.platform, s.date,
   t.avgPrice
FROM sales s 
JOIN users u ON u.ID = s.sellerID 
LEFT JOIN sold so ON s.saleID = so.saleID 
LEFT JOIN (
    SELECT AVG(s2.price) as avgPrice, s2.carID, s2.year
    FROM sales s2 
    GROUP BY s2.carID, s2.year
    HAVING COUNT(s2.saleID) > 5
) t ON t.carID = s.carID AND t.year = s2.year
WHERE so.saleID IS NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2021-03-09
    • 2021-02-13
    • 2017-05-07
    • 1970-01-01
    相关资源
    最近更新 更多