[英]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
UPDATE
根據評論,我嘗試了兩種方法。 我嘗試在一個循環中使用mysql_fetch_array
,並使用mysqli::fetch_all()
方法,在我們生產的大型表上。 mysqli::fetch_all()
使用的內存更少,運行速度比mysql_fetch_array
循環更快。
該表有大約500000行。 mysqli::fetch_all()
在2.50秒內完成加載數組中的數據,並沒有達到腳本中設置的1G內存限制。 在3.45秒后, mysql_fetch_array()
因內存耗盡而失敗。
問題不在於循環,而在於您將數百萬條數據(可能很大)從數據庫傳輸到內存中。 無論你采取哪種方式,都需要時間。 無論如何,有人需要在某個地方循環。
簡而言之:減少從數據庫中獲取的數據量。
不推薦使用mysql
,您可以在mysqli
和PDO
找到所需的功能。 這是切換到更新的MySQL擴展的完美借口。 對於mysqli
和PDO
,方法是fetchAll
(注意mysqli::fetch_all
需要運行mysqlnd
驅動程序)。
在mysql中沒有它的選項。 雖然你可以使用pdo的fetchall()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.