2011-05-22 46 views
2

我在網上商店工作,需要一些建議,以獲取有關收集數據以顯示價格,免費送貨和其他選項的過濾選項的最佳方法涉及數據庫的計數。我的腳本是用mySQL上的PHP編寫的。通過最小的數據庫查詢提供類別/搜索結果過濾所需的建議

如果您看亞馬遜的產品類別(即http://www.amazon.com/gp/search/ref=sr_nr_scat_14219011_ln?rh=n%3A14219011%2Ck%3Awii&keywords=wii&ie=UTF8),您會看到左側邊欄上的過濾選項旁邊是每個類別的結果數量。例如,任天堂有163場比賽。

我不認爲這是存儲在一個表中,因爲有太多的變量你會不斷地更新數據庫,但它也似乎不切實際的運行查詢每個過濾組5-6查詢每調查頁面加載。

在緩存中檢索大型數據集,使用PHP過濾下來的結果,然後只顯示一些結果或者是潛在的數千個項目的查詢比運行一些次要計數查詢更糟?還有其他解決方案嗎?

回答

1
SELECT COUNT(*) cnt, category FROM table WHERE category IN() GROUP BY category 
+0

有可能會是某種包含IN(SELECT品牌源自品牌,其中像「%」關鍵字的一個子查詢mysql_real_escape_string ($ _REQUEST ['keywords'])。'%「)+1 tho – 2011-05-22 05:30:00

1

我無法想象這是存儲在表中,因爲有這麼多的變數,你會不斷地更新數據庫,但它似乎也不切實際運行每個過濾組查詢到的調每頁加載5-6個查詢。

它實際上是實用的。小數據集(幾百個)上的SQL計數速度非常快,如果可以通過索引訪問它們。 (但請參閱下文,因爲它確實更好。)

在緩存中檢索大型數據集,使用PHP篩選結果並僅顯示一些結果或是否可能有數千個項目比運行一些次計數查詢更糟?

這樣做最終會比使用SQL慢。只要你的整個緩存不再適合內存,你最終會採取將其存儲在磁盤或類似的東西。在這一點上,您最終會像瀏覽數據庫中的全表掃描一樣完成緩存數據。

有沒有另一種解決方案?

是的。它是使用內存緩存,以避免一遍遍重做查詢:

http://php.net/manual/en/book.memcached.php