2012-12-28 47 views
3

我正在使用wordpress,它有一個不錯的databaseinterface,這對於做很多簡單的查詢非常有用。性能影響php中的filter/order/limit數組(對於+ if)vs SQL子句

我想使用這個接口,但它不允許我做一些特殊的過濾。然後我想我可以從數據庫中返回一個結果集,然後用一個嵌套的if做一個過濾器,取出我不想要的結果。

我正在考慮爲訂購做同樣的事情。我知道,如果我有索引(在PHP中,我不能讓他們爲數組,但在我有MySQL)像過濾器(WHERE)和排序的操作超級快速,比順序。

我在考慮php_mysql適配器的性能,我不知道它是否使用延遲加載數據,遊標以及將數據從數據庫傳遞到php的內存含義。

另一種用途是限制/計數,在生成分頁鏈接的常見情況下,其中一個需要有限的數據,但也需要總數。有兩個選項可以做到這一點:

  • 使用兩個查詢:一個用於計數,另一個用於限制和實際數據。使用
  • 一個查詢沒有限制,並且沒有人知道是做什麼用PHP這項工作與MySQL性能蘊涵在PHP

計數resulset?

回答

1

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:我會爲您提供的第一個選項,運行兩個查詢。

0

我認爲返回完整的結果集,然後在PHP中計算它們將是一個非常糟糕的主意。如果您需要向最終用戶(即Y的第X頁)顯示完整計數,則只需使用數據庫查詢獲取記錄計數,然後執行查詢即可獲取分頁數據。