2012-07-20 41 views
0

那麼,successfull下面的php代碼會將url字段中的所有行相加。一次將所有SQL查詢提取到數組中?

$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列表以百萬計,那麼它需要很多時間(特別是在本地主機)。所以,我想知道如何將sql查詢結果直接導入數組而不使用循環。可能嗎?

+0

PHP不打算出手多兆值得內存中的數據的。它不**內存效率高。你計劃如何處理這些數據?你不能在SQL查詢本身中做任何你需要的操作嗎? – 2012-07-20 14:36:05

+0

您是否真的需要所有這些百萬行,您是否向用戶顯示了那麼多行?如果是這樣,爲什麼,我覺得你沒有告訴我們這裏的一切,比如分頁問題或查詢中缺失的結,比如過濾掉一些行的條件...... – 2012-07-20 14:47:24

回答

1

你應該考慮使用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()

+2

...並且仍然會很慢 - 吸吮無論您使用的是哪個db數據庫,數百萬行到一個PHP數組都會抓取。 – 2012-07-20 14:36:31

+0

@MarcB絕對。問題是關於加載數組中沒有循環的所有行。我不是說這是一個奇蹟般的解決方案;) – Tchoupi 2012-07-20 14:37:48

+0

@MathieuImbert這個問題是相對於加載一百萬行而不需要幾秒鐘來讀取數據... – 2012-07-20 14:45:14

1

問題不在於循環,而在於您將數百萬條數據(可能很大)從數據庫傳輸到內存中。無論你如何做,都需要時間。無論如何,有人需要循環。

簡而言之:減少您從數據庫中獲得的數據量。

0

mysql已被棄用,你想要的功能在mysqliPDO被發現。這是切換到較新的MySQL擴展的完美藉口。對於mysqliPDO,方法是fetchAll(請注意,mysqli::fetch_all要求mysqlnd驅動程序運行)。