PHP處理某些數據結構(例如hashtables(在PHP中將常規數組視爲hashtable))的處理效率很高。沒有那麼高效的是在代碼中訪問這些結構。讓我試着在下面進行說明。
假設您正在遍歷數組中的所有項目,並進行比較並排除項目。我能想到的兩種方法可以做到這一點:
數1:
$arr = array_filter($arr2, function($item) { return $item > 2; });
array_filter
在這種情況下,基本上會遍歷所有$ ARR2項目,檢查他們是否大於2,以及添加它到$ arr,如果是的話。
數2:
$arr = array();
foreach ($arr2 => $item) {
if ($item > 2) {
$arr[] = $item;
}
}
在這裏,你也遍歷所有$ ARR2項目,檢查他們是否大於2,以及將它添加到$編曲。這基本上是如何實現array_filter
。
這裏的巨大差異是:php的編譯庫訪問數據結構比解釋代碼快得多,即使它的字節碼被緩存。繼續並運行一些測試。調用array_filter
一次比打開每個單獨的項目代碼更快。
請記住那些只是didatic的例子,我不建議你通過遍歷每個項目來過濾你的數組。我只使用這些示例來表明,訪問PHP中的數據結構可能比讓組件訪問它們(在本例中爲mysql)時要慢一些。這僅僅代表了一些性能增益。
當您在MySQL子句中過濾某些內容時,您不會遍歷每個表格行並排除不想要的內容,就像我們以前所做的一樣。但你已經知道,我只是在重複你所說的話。
這同樣適用於對結果集進行排序,剪切和計數。 MySQL可能會比你在代碼中更快地訪問你的數據結構。
這裏的最佳結果(與結果集的大小略有不同,但我認爲它可以增長,否則你不想分頁)就是把它留給MySQL。
但是運行兩個查詢也可能不是最佳結果。如果你可以連接兩個查詢(也許使用UNION
子句),它會爲你節省一些開銷。這很醜陋,但是理論上它應該運行得更快(即使它可能難以區分,因爲PHP與MySQL的通信非常高效)。你會犧牲很多可讀性來獲得難以察覺的性能。
TL; DR:我會爲您提供的第一個選項,運行兩個查詢。