下面的php代码成功地将url
字段中的所有行相加。
$sql = "SELECT * FROM table WHERE url <> ''";
$result = mysql_query($sql,$con);
$sql_num = mysql_num_rows($result);
while($sql_row=mysql_fetch_array($result))
{
urls[] = $sql_row["url"];
}
问题是,如果url列表以百万计,那么它将花费大量时间(尤其是在localhost中)。因此,我想知道一种不使用循环而直接将sql查询结果获取到数组中的方法。有可能吗?
问题不在于循环,而是将数百万条数据(可能很大)从数据库转移到内存中。不管你怎么做,都需要时间。无论如何都需要有人在某个地方绕圈。
简而言之:减少从数据库中获取的数据量。
您应该考虑为此目的使用mysqli。fetch_all()
方法将允许这样做。
http://php.net/manual/en/mysqli-result.fetch-all.php
更新
根据评论,我尝试了这两种方法。我尝试在循环中使用mysql_fetch_array
,并在生产中的一个大表上使用mysqli::fetch_all()
方法。mysqli::fetch_all()
确实比mysql_fetch_array
循环使用更少的内存并且运行得更快。
该表大约有500000行。mysqli::fetch_all()
在2.50秒内完成了数组中的数据加载,并且没有达到脚本中设置的1G内存限制。mysql_fetch_array()
在3.45秒后因内存耗尽而失败。
mysql
已弃用,您需要的功能可在mysqli
和PDO
中找到。这是切换到较新MySQL扩展的完美借口。对于mysqli
和PDO
,方法都是fetchAll
(注意,mysqli::fetch_all
需要运行mysqlnd
驱动程序)。
在mysql中没有它的选项。尽管您可以使用pdo的fetchall()
http://php.net/pdostatement.fetchall