2016-02-25 85 views
2

我看到mysqli_fetch_array()mysqli_fetch_all()之間的比較,這表明與mysqli_fetch_all()它將需要更多的內存,我將不得不迭代數組。mysqli_fetch_array()或mysqli_fetch_all()?

mysqli_fetch_all()是一個呼叫到mysqli但是mysqli_fetch_array()是每行一個呼叫,例如100個呼叫。

我不知道mysqli處理是如何工作的:調用mysqli_fetch_array()真的更有效率嗎?

(I已經理解的是,返回的數據可以是關聯數組或不)

+0

返回的數據不要混淆調用數據庫執行查詢和調用來檢索結果集的記錄.. ...他們是完全不同的野獸 –

+0

進步。謝謝!所以整個結果集從數據庫返回並由mysqli本地使用。不是說結果集被滴回去了嗎? – Steve

回答

1

From PHP's page on mysql_fetch_all()

我測試使用fetch_allwhile/fetch_array和:

fetch_all使用較少的內存(但不是那麼多)。

在我的情況(TEST1和TEST2):147008,262848字節(fetch_all)與147112,262888字節(fetch_array & while)。

所以,關於內存,在這兩種情況下都是一樣的

然而,有關性能:

我的測試需要:使用fetch_all 350毫秒(最壞情況),而它使用最壞fetch_array和需要使用fetch_array,或約35%464ms(最壞情況)一個while週期

所以,使用fetch_all,對於返回的信息,適量是正常碼:

一個。 清潔劑(單行代碼)
b。 使用較少的內存(約減少0.01%)
c。 更快

PHP 5.6 32位,Windows 8.1中64位

+1

我想這取決於「正常代碼」的定義,以及是否考慮了mysqli :: use_result/mysqli :: store_result/mysqli :: reap_async_query。 – VolkerK

+0

這也僅適用於將所有數據一次存儲在內存中的情況。如果你只是簡單地在一個循環中「echo」一行然後丟棄它,那麼'fetch_array'可能會使用更少的內存。 – deceze

1

它無關,與任何效率。僅關於可用性

fetch_all()是一種被稱爲「語法糖」的東西 - 簡化了自動執行頻繁執行的操作。

function mysqli_fetch_all ($resouce, $mode = MYSQLI_BOTH) 
{ 
    $ret = []; 
    while ($row = $resource->fetch_array($mode)) 
    { 
     $ret[] = $row; 
    } 
    return $ret; 
} 

因此,你可以告訴使用的情況下這些功能:它可以作爲一個用戶態功能可以輕鬆實現

  • fetch_all()有,如果你需要數組使用,包括所有的返回的行,這將在別處使用。
  • fetch_assoc()如果您要逐一處理所有行,則必須使用循環。

就這麼簡單。

這些功能具有不同的目的,因此在比較它們時沒有意義。

注意,PDO是十倍語法糖方面更加甜美,因爲它fetchAll()功能可以dozens different formats