【问题标题】:Iterate mysqli unbuffered query result more than once多次迭代 mysqli 无缓冲查询结果
【发布时间】:2013-08-09 06:42:08
【问题描述】:

问题:

我有一个返回大型结果集的查询。它太大而不能带入 PHP。我收到致命的内存最大错误,无法增加内存限制。 Unbuffered Queries

我需要多次迭代数组,但 mysqli_data_seek 不适用于无缓冲查询。 mysqli_result::data_seek

//I have a buffered result set
$bresult = $mysql->query("SELECT * FROM Small_Table");

//And a very large unbuffered result set
$uresult = $mysqli->query("SELECT * FROM Big_Table", MYSQLI_USE_RESULT);

//The join to combine them takes too long and is too large
//The result set returned by the unbuffered query is too large itself to store in PHP
//There are too many rows in $bresult to re-execute the query or even a subset of it for each one

foreach($bresult as &$row) {
    //My solution was to search $uresult foreach row in $bresult to get the values I need
    $row['X'] = searchResult($uresult, $row['Key']);
    //PROBLEM: After the first search, $uresult is at its and and cannot be reset with mysqli_result::data_seek
}

function searchResult($uresult, $val)
    while($row = $uresult->fetch_assoc()){
        if($row['X'] == $val) {
            return $row['X'];
        }
    }
}

如果您有其他满足这些要求的解决方案,我会接受: - 不尝试在单个查询中加入结果(花费太长时间) - 不对另一个查询中的每个结果运行任何查询(查询太多、耗时太长、降低系统速度)

如果您需要更多信息,请发表评论。

谢谢。

【问题讨论】:

  • 我可以在用户mysqli::real_query 之后多次调用mysqli::use_result 吗?
  • SELECT * FROM gigantic_table 是任何应用程序的死亡之吻。您将需要使用LIMITOFFSET 来获取更小的数据块。还可以尝试检索您绝对需要的列。
  • @tadman 我实际上并没有做那个查询。这只是示例代码。我只查询所需的数据。
  • 很高兴知道。不过,您至少需要LIMIT。如果您真的遇到麻烦,您可以随时使用SELECT ... INTO OUTFILE 将数据转储到纯文本文件中,并以您想要的任何方式进行解析。

标签: php mysql unbuffered-queries


【解决方案1】:

如果您正在尝试处理大数据集,您是否考虑过使用 Hadoop 之类的中介?您可以设置一个小型 hadoop 集群,进行处理,然后让您的 php 代码向 hadoop 输出请求处理后的数据。

【讨论】:

  • 这就像建议使用核弹在你的后院挖沟一样。
  • 感谢您的建议,但对于这个小任务来说有点过头了。
  • 他说数据库很难加入他的查询。 "//合并它们的连接时间太长而且太大"。那是一个经过优化的编译 C 程序。而且您认为一点 PHP 将克服他所说的 数据库 花费太长时间的连接问题!?!
  • 有一些方法可以通过调整查询数据库的方式来解决这个问题。这不是一个罕见的问题。
  • 所以我想我应该在所有这一切的开头说,确保你的连接使用索引列,而不是选择 * 确保你只得到你需要的列,等等......如果你看了看来,加入仍然真的太大了..我不认为迭代PHP中的东西会有助于加快任何东西... span>
猜你喜欢
  • 2013-12-24
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
相关资源
最近更新 更多