SQL - 传输数据时

时间:2013-08-19 15:04:45

标签: sql fetch

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

1选择第一个数据块

SELECT * FROM TABLE LIMIT 1,10000

2阻止的过程

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

3下一个街区

等等。

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

但我的问题是:执行select时,结果集被传输而不是存储在某个本地部分,结果是fetch是本地的,或者结果集存储在远程系统中并且记录在任何提取中逐个进行?因为如果真实场景是第二个我不执行3次通话,而是30000通话,而不是我想要的。

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

再见

3 个答案:

答案 0 :(得分:0)

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

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

假设您有这样的东西:

$res = mysql_query(...);

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

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

希望这能回答你的问题。

答案 1 :(得分:0)

根据文档here将所有数据提取到服务器,然后通过它。

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

此外,它已被弃用,因此你可能想要使用那里建议的其他内容。

答案 2 :(得分: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会在使用PDO::query()PDO::prepare()执行查询并使用PDO::fetch()检索结果时根据需要加载数据。
要将结果集中的所有数据检索到PHP数组中,可以使用PDO::fetchAll()
准备好的语句也可以使用PDO::MYSQL_ATTR_USE_BUFFERED_QUERY常量,但建议使用PDO::fetchALL()


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