2014-09-03 14 views
0

對不起,這可能是一個noob問題,但我不知道如何搜索這個。通過執行分頁減少連接表,按?

用戶案例
一個全網站搜索功能:當用戶輸入關鍵詞並提交表單,該系統應該在這兩個標題&內容的論壇,博客,產品搜索。所有這些類型的頁面的搜索結果應顯示在一個單獨的分頁列表中。用戶還可以選擇通過相關性或新近度對結果進行排序。

我做了什麼
我正在使用LMAP。我有這些三種頁面類型的數據表,並且我已將內容列的標題作爲索引密鑰&。
我知道連接表是一個非常糟糕的主意,所以我爲搜索論壇,博客和產品做了三個單獨的查詢。我將所有的數據導入到PHP中,並將它們變爲數組,併爲每行搜索結果編寫一個相關值的函數。對於新近來說,所有這些表中都有「updateDate」列,所以它沒問題。
現在我有三個不錯的數組。我可以內爆()他們和排序()他們很容易。我也可以通過array_slice()來渲染分頁。

是什麼使我皺眉
不必要的性能浪費。是的,我所做的是能夠在用戶案例中完成所有的事情,但是---我不知道該怎麼做(我是一個初學者)---但我相信這樣的表現可以更好。

  1. 第一次查詢後,都需要我們已經從數據庫中獲取數據。但隨着我的解決方案,每當用戶點擊搜索結果的另一頁,或更改「排序」,php將重新開始,並再次執行[sql查詢,相關函數,implode()]。我可以如何將結果數組存儲在某處,這樣系統可以爲下一次用戶操作節省一些能量?
  2. 大部分用戶不會點擊搜索結果的所有頁面。我猜想90%的用戶不會繼續關注第10頁,這意味着(可能)是前200個記錄。那麼,我可以做任何事情來停止sql查詢而不是所有的結果嗎?此外,在流量增長的同時,可能會出現一些關鍵字並且重複搜索大量時間,我該怎麼做才能減少這些搜索的重複次數? (請打我,如果你想我想得太多了)

感謝您閱讀這些,請糾正我,如果我的觀念是不正確,或者告訴我,如果我錯過了什麼在這種情況下,用戶需要注意。謝謝,願上帝的愛與你同在。

編輯:我沒有使用任何PHP框架。

+0

搜索 「緩存」。但是,在那裏*有大量的訪問者(比如它太慢),不要擔心。另外一個「連接表是一個非常糟糕的想法」是**不是一個正確的廣義信念;從適當的規範化和連接表開始,比起擔心一些尚未解決的性能問題要好得多。不妥協的模型眼前利益可以簡單地進行使用使用MySQL的全文*正確的指數*和*是*,雖然也有像[Lucene的其他選項(http://stackoverflow.com/questions/6820527/lucene-或MySQL的,全文搜索)。 – user2864740 2014-09-03 02:29:54

+0

@ user2864740對不起,你可以慢一點點?我不知道「從適當的標準化開始」是針對comman案的,而不是針對這種情況?因爲這些頁面類型之間沒有關係,它們就像模塊,而不是列中的爭用...(createUser和updateUser除外)。所以我會認爲不會建議加入他們時選擇,對吧? – 2014-09-03 02:44:35

+0

你是拉動整個搜索結果到瀏覽器的JavaScript,但只顯示一小行,同樣的進程正在發生第2頁?你應該看看SQL分頁。 – Malk 2014-09-03 02:48:59

回答

0

爲了讓你的整個故事可能像寫一本書。這裏有一些想法提取:

  • 完全吹成頁指標花費你額外的數據集數 - 這可以通過選擇來彌補目前只是「下一步」按鈕...極限[nr_of_items_per_page + 1],然後,如果(isset ($ result [nr_of_items_per_page + 1]))輸出下一個按鈕
  • 這些天的淨流量成本沒有十年前那麼高,用戶需求更多。提高您nr_of_items_per_page至100,200,500(取決於每條記錄的數據量)
  • Zitty山藥意見制定出 - 我曾在一個去到客戶端裝> 10000條記錄,並逐件提出的一塊 - 它只是岩石 - 例如。包含10個字符的10000個名稱的平均值僅爲100000字節。你在網上獲得的大部分圖像都比那個大。原因有限制...通過$ SESSION
  • PHP緩存的作品,以及 - 但是記住,每個字節爲PHP保留保留,不能專注於數據庫中(至少不是一個共享的服務器上)。只要不是在數據庫中的所有數據放入內存,在大多數情況下,它是更有效的,而擴展數據庫內存比增加PHP緩存或OS緩存。