【问题标题】:PHP looping through records very slowPHP循环记录非常慢
【发布时间】:2012-10-28 19:34:08
【问题描述】:

我正在使用 PDO。所以我有一个语句准备一个查询来选择一堆记录。示例:

   //select duplicates
   $stmt = $this->db->prepare('SELECT Name COUNT( * ) AS CNT
            FROM  `Test`
            GROUP BY Name
            HAVING CNT > 1');

   $stmt2 = $this->db->prepare('SELECT * FROM Test2 WHERE TName = ?');

请注意,我确实需要选择所有数据,而不是某些列。该表包含 5k 条记录,有时甚至更多。我需要选择所有 5k 条记录,并且对于每条记录,我都需要执行另一个查询来选择其他内容。

   $arr = array();
   while ($row = $stmt->fetch(DB::FETCH_ASSOC)) {
       $stmt2->execute($row['Name']);
       $arr[] = $stmt2->fetchAll(DB::FETCH_ASSOC);
   }

我知道我可以使用连接,但对于我的情况,连接不起作用,因为我需要循环数据并为每个 stmt1 行执行 stmt2。

当我运行它时,它最多需要 10-15 分钟,这是我不能允许的,我需要它更快。谁能告诉我问题是什么? 5k 条记录似乎不需要循环。

      STMT1 returns up to 5.5k records

我需要为每个返回的副本提供数据:

【问题讨论】:

  • 你执行的第二个查询是什么?
  • 您在查询的表上有正确的索引吗?
  • 是的,我确实使用了索引,并且我更新了第二个查询的内容
  • “但对于我的情况,连接将不起作用” - 我非常怀疑。根据您的代码,连接正是您所需要的。而且它很慢,因为在加载一个页面时,每个页面加载执行 5000 个查询,因为每条记录执行一个查询。太荒谬了。
  • 但我使用的实际代码将无法加入,因为我选择了重复项并且对于每个重复项我需要运行代码

标签: php mysql loops pdo query-optimization


【解决方案1】:

连接不起作用?高度怀疑:

SELECT test2.*, count(test.name) AS cnt
FROM test
LEFT JOIN test2 ON test2.id = test.id
GROUP BY test.name
HAVING (cnt > 1)

考虑到 OP 的麻烦,再试一次:

SELECT *
FROM test2
WHERE name IN (
   SELECT DISTINCT name
   FROM test
   GROUP BY name
   HAVING (count(*) > 1)
)

【讨论】:

  • 我试过了,它有效,但它不返回两条记录的记录,当我需要两条记录时它只返回一条记录我的意思是两个重复
  • 仍然需要很长时间第二个似乎是解决方案,但它需要很长时间我已经等待它返回行超过 5 分钟了
【解决方案2】:

如果由于某种原因您不能使用 JOINS,请创建一个存储过程,它将一个 id 作为参数并返回您需要的数据。

您还可以对Name 使用字典编码,因为整数运算要快得多。

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 2012-09-20
    • 2011-08-09
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    相关资源
    最近更新 更多