一次将所有SQL查询提取到一个数组中


Fetch all SQL query into an array at a time?

下面的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已弃用,您需要的功能可在mysqliPDO中找到。这是切换到较新MySQL扩展的完美借口。对于mysqliPDO,方法都是fetchAll(注意,mysqli::fetch_all需要运行mysqlnd驱动程序)。

在mysql中没有它的选项。尽管您可以使用pdo的fetchall()

http://php.net/pdostatement.fetchall