0

url好吧,下面的 php 代码成功地添加了该字段中的所有行。

$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 查询结果直接放入数组而不使用循环的方法。可能吗?

4

4 回答 4

1

您应该考虑为此目的使用 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 秒后因内存耗尽而失败。

于 2012-07-20T14:34:51.680 回答
1

问题不在于循环,而在于您将数百万条数据(可能很大)从数据库传输到内存中。无论您采用哪种方式,都需要时间。无论如何,有人需要在某个地方循环。

简而言之:减少从数据库中获取的数据量。

于 2012-07-20T14:35:09.430 回答
0

mysql已弃用,您想要的功能在mysqli和中找到PDO。这是切换到较新的 MySQL 扩展的完美借口。对于mysqliPDO,方法是fetchAll(注意mysqli::fetch_all需要mysqlnd驱动程序运行)。

于 2012-07-20T14:35:59.040 回答
0

mysql中没有它的选项。虽然你可以使用 pdo 的 fetchall()

http://php.net/pdostatement.fetchall

于 2012-07-20T14:36:23.430 回答