0

我需要从远程数据库中获取大量数据。这个想法是做一种分页,像这样

1 选择第一个数据块

SELECT * FROM TABLE LIMIT 1,10000

2 处理阻塞

while(mysql_fetch_array()...){
    //do something
}

3 获取下一个块

等等。

假设 10000 是我的系统允许的维度,让我们假设我有 30000 条记录要获取:我对远程系统执行 3 次调用。

但我的问题是:执行选择时,结果集被传输,然后存储在某个本地部分,结果是 fetch 是本地的,或者结果集存储在远程系统中,并且在任何 fetch 时记录一个接一个?因为如果真实情况是第二次,我不执行 3 次呼叫,而是执行 30000 次呼叫,这不是我想要的。

希望我解释一下,谢谢帮助

再见

4

3 回答 3

0

您将执行 3 个电话,而不是 30.000。这是肯定的。

每 10.000 个结果批次在服务器上呈现(通过执行 3 个查询中的每一个)。您的 while 遍历 MySQL 已经返回的一组数据(这就是您没有 30.000 个查询的原因)。

那是假设你会有这样的事情:

$res = mysql_query(...);

while ($row = mysql_fetch_array($res)) {
    //do something with $row
}

您在while循环中使用的任何$row操作都与从初始查询中获取的数据有关。

希望这能回答你的问题。

于 2013-08-19T15:16:06.283 回答
0

根据此处的文档,所有数据都被提取到服务器,然后您通过它。

从页面: Returns an array of strings that corresponds to the fetched row, or FALSE if there are no more rows.

此外,它接缝已被弃用,因此您可能想要使用那里建议的其他东西。

于 2013-08-19T15:18:32.827 回答
0

首先,强烈建议使用 MySQLi 或 PDO 而不是弃用的mysql_*函数 http://php.net/manual/en/mysqlinfo.api.choosing.php

默认情况下,使用 mysql 和 mysqli 扩展,在执行查询时将整个结果集加载到 PHP 的内存中,但这可以更改为按需加载结果,因为如果需要或需要检索行。

  • mysql
  • mysqli
    • mysqli::query()
      $resultmode参数决定行为 。
      默认值MYSQLI_STORE_RESULT会导致整个结果集被传输到 PHP 的内存中,但使用MYSQLI_USE_RESULT会导致按请求检索行。

PDO::query()默认情况下,PDO 将在使用或PDO::prepare()执行查询并使用 检索结果时根据需要加载数据PDO::fetch()
要将结果集中的所有数据检索到 PHP 数组中,可以使用 Prepared 语句,也可以使用常量,但建议使用。PDO::fetchAll()
PDO::MYSQL_ATTR_USE_BUFFERED_QUERYPDO::fetchALL()


最好坚持默认行为并对任何更改进行基准测试以确定它们是否真的有任何积极的结果;单独传输结果的开销可能很小,而其他因素在确定最佳方法时可能更重要。

于 2013-08-19T15:26:53.473 回答