我需要从远程数据库中获取大量数据。这个想法是做一种分页,比如这个
1选择第一个数据块
SELECT * FROM TABLE LIMIT 1,10000
2阻止的过程
while(mysql_fetch_array()...){
//do something
}
3下一个街区
等等。
假设10000是我系统允许的维度,让我们假设我有30000条记录:我执行3次远程系统调用。
但我的问题是:执行select时,结果集被传输而不是存储在某个本地部分,结果是fetch是本地的,或者结果集存储在远程系统中并且记录在任何提取中逐个进行?因为如果真实场景是第二个我不执行3次通话,而是30000通话,而不是我想要的。
我希望我解释一下,谢谢你的帮助
再见
答案 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_query()
将整个结果集缓存在PHP的内存中mysql_unbuffered_query()
仅在请求行时从数据库中检索数据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()
。
最好坚持使用默认行为并对任何更改进行基准测试,以确定它们是否确实有任何正面结果;单独转移结果的开销可能很小,其他因素在确定最佳方法时可能更为重要。