2012-10-14 64 views
0

我正在開發一個Web應用程序,讓用戶搜索數據庫中的項目。這些項目分爲幾類。根據其字段值,每個返回的搜索項都顯示不同。目前我建立了一個類來處理顯示,另一個處理搜索。搜索類使用多個用戶輸入構建SQL查詢,在數據庫中查詢與用戶輸入相匹配的項目的ID,並將數組中的ID發送到顯示類。如何優化此搜索結構?

執行此代碼的摘錄:

//the sql query is actually a little more complex than this 
$query = "SELECT items.id FROM items, subcategories WHERE {$name} AND items.`base_school` = '{$_SESSION['base_school']}' AND items.subcategory = subcategories.id AND subcategories.parent_category = {$search_category} ORDER BY `time_added` DESC {$limit}"; 
$result = $DB_CONNECTION->query($query); 
$newly_added = array(); 
while (list($id) = $result->fetch_row()) $result[] = $id; 
searchDisplay::print_result($result); 

的顯示類查詢數據庫的每個項目的一個在另一個之後的全部細節,並將其顯示,因爲它應該被顯示。

第一次查詢數據庫並將數據存儲在數組中然後通過數據庫查詢數據庫的全部詳細信息(來自3個不同表的大約23個字段),是否會更好/更快地查詢數據庫該數組的顯示類,而不是讓顯示類使用項唯一ID來查詢每個項目的數據庫?我目前的解決方案現在運行良好,但我需要知道,當數據庫開始增長時(約500,000行),它們是否會對我的方法造成任何問題。其次,使用由用戶提供的若干搜索條件來過濾來自數據庫的數據。用一些能夠容納所有用戶條件的聯合來構建一個複雜的查詢,或者編寫一個容納主要過濾器的簡單查詢,然後使用PHP來過濾剩餘的幾個不符合搜索條件的結果會更好嗎?

回答

1

在我看來,結果的篩選需要在每一步完成。否則隨着數據越來越大,查詢會變得越來越慢。因此,上段提到的策略是最佳策略。

+2

這不會減慢PHP本身的速度,並且會影響頁面的總體分析時間,甚至比MYSQL還差嗎? MYSQL具有非常好的數據處理能力,並且可以比PHP更好地處理數據。我需要對此有更深入的瞭解。 –

1

您應該總是儘量避免將查詢放在循環中。單個查詢,即使它很複雜,通常速度更快,並且規模更好。像所有的「規則」一樣,也有例外。如果循環比複雜的查詢快得多,那麼你應該堅持循環,因爲你知道它不會成長爲數十或數百次迭代(對吧?)。

就數據庫或PHP中的過濾而言,通常最好在數據庫中進行過濾,並避免通過網絡傳輸無用的數據。在MySQL中使用HAVING選項通常等同於您在PHP中執行的過濾操作。

+2

循環每個請求大約需要25次迭代,並且迭代次數更少。 –

+1

就我個人而言,我不會在一個循環中保留查詢。無論查詢有多簡單,任何數據庫都可以處理每秒最大查詢次數。同時發出的3個請求可能意味着您嘗試實現每秒300個請求。這不會擴展。 –

+2

非常感謝,我可能不會爲每秒的最大查詢感到困擾,直到我的託管服務器開始抱怨.... –

1

您需要記住等待時間。通常,網絡應用程序運行緩慢,延遲是罪魁禍首。

即使每個單獨的查詢都很小並且可以快速執行,它們都有延遲。你說最壞的情況下,100個查詢。

即使每個查詢的延遲時間僅爲10毫秒(請記住每個查詢需要網絡驅動程序的開銷,線路上的實際往返時間等),您不必要地增加100 * 10ms = 1秒(令人難以置信長期以計算機術語來說)。

最有可能它會採取小於一秒多的,只需執行1個查詢獲取所有的信息在一杆。那麼你只會遭受延遲懲罰一次。

所以我建議重寫你的方法使用一個查詢,並通過周圍的數組,你建議。因爲人們在客戶端和服務器之間的延遲非常低(例如,在沒有太多活動的相同服務器上)的環境中進行測試,所以這樣的事情一直在進行測試。然後,應用程序走向現實世界,並且客戶端和服務器都很忙碌,相隔數百英里......