2011-11-04 67 views
1

我一直花費在PHP中爲我的網站構建這個自定義搜索功能,它根據最終用戶提供的選項和輸入增量地構建MySQL查詢。它在我的本地服務器上完美工作,但是當我將它上傳到生產站點時,它運行速度很慢。我對PHP和MySQL編程相對陌生,所以我對一般和未來項目都很好奇:讓PHP或MySQL完成繁重的任務會更好嗎?

運行搜索查詢時,是否最好有一個複雜的精確MySQL查詢來過濾數據並返回PHP顯示的結果,或者運行一個簡單的MySQL查詢並從數據庫中獲取一堆數據並讓PHP篩選數據並顯示結果?

+2

檔案,型材,異型材... –

+1

過濾在DB儘可能有道理在大多數情況下 - 從在發送數據的多演出沒有意義一個巨大的表格,只能讓PHP從一個記錄中的一個字段中丟棄除一個字節以外的所有字節。但是,YMMV。 –

回答

0

我認爲你可以將它結合起來以獲得最佳效果。首先,運行完全匹配或非常接近匹配的查詢。基本上,如果有人搜索頁面的確切名稱,你只想返回(=而不是LIKE)。然後,也許如果他們得到了第一部分權利(喜歡'%')。最後,用MySQL來完成一個更復雜的任務。這確保了用戶提供最佳數據時的最快回報。

0

優化Web應用程序時會發揮幾個變量。根據你的陳述,允許用戶選擇幾個選項來建立一個查詢讓我相信你可能會做一些成本高昂的MySQL操作。您希望遠離OR,並且如果您需要執行任何ORDER BY,則只需填充結果數組然後對數組進行排序即可在應用程序層執行此操作。

您可能還想考慮添加一個位於MySQL層之上的緩存層,因此您不必每次都訪問數據庫。

正如Kerrek在他的評論中提到的,您可以通過配置文件來了解瓶頸所在,查看XDebug(http://xdebug.org/)和KCacheGrind(http://kcachegrind.sourceforge.net/html/) Home.html)

只是一些想法,讓你開始。

2

這是一個平衡的行爲。這是我的建議:

  • 使用FULLTEXT使字符串搜索更快。
  • 在您的WHERE子句中對您的字段進行排序,以便先索引列,然後是數字,然後是日期,然後是文本字段。這將通過在廉價的列之後過濾昂貴的列來減少您的負擔,從而減少數據庫的工作量。
  • 在處理大型數據集時避免ORDER,並將此處理卸載到您的PHP代碼中,因爲它可以節省MySQL在查詢中的每個點處排序數據。
  • 索引最常用或搜索範圍較大的字段。
  • 當您可以輕鬆執行兩個或多個查詢時,請勿使用大量的JOIN。在一些大型表上有10個或20個JOIN的查詢可以完全殺死你的數據庫。
  • UNION有助於在同一張表上同時執行幾個SELECT查詢,而不是用OR來完成複雜的邏輯。

一般而言,最佳查詢應該是足夠的。有些角落案例在PHP中進行工作很有用,但對於99%的案例,數據庫應該足夠快。

1

如果數據庫被許多Web服務器訪問,那麼對MySQL服務器做大量的處理可能不是一個好主意。其次,如果您使用產生大量數據的查詢,那麼您的數據將長時間傳輸到Web服務器,並且您將不得不在php中進行更多的處理。另一方面,MySQL使用很多優化,以便它有效地獲取數據。

所以這一切都取決於你在做什麼

相關問題