2012-08-25 109 views
0

我儘可能少地影響性能,並努力做到這一點。PHP MySQL的操作方法和性能

這裏的設置...

搜索與搜索精煉過濾器,使一個AJAX調用返回結果的新(精)設置PHP處理結果頁面。

我有4個表包含我需要連接到PHP處理程序代碼中的所有數據。

表1 - 與主要細節

表2的記錄主表 - 評分從專業評級公司#每個產品1

表3 - 評分從專業評級公司#每個產品2

表4 - 來自專業評級公司#3的每個產品的評級

搜索結果頁面上的精煉者是jquery滑塊,範圍從最低允許評分到最高評分。

移動滑塊句柄時,將使用新值創建新的AJAX調用,並運行數據庫查詢以創建一組全新的提煉結果。

從表1中獲取我需要的數據是非常簡單的部分。我正在努力的是如何有效地在其他3個表中包含連接,並只拾取與精煉值/範圍相匹配的行。表2,3和4的年份(2004 - 2012年)都有多個列,當我初步嘗試將其全部納入一個查詢時,它陷入了困境。

表2,3,4保持每個記錄的各種等級表1

表2,3列,4 ... ID - 的productID - y2004 - y2005 - y2006 - y2007 - ...你明白了。

每年的每列都有一個數字值(默認爲0)。

我需要做的是有效地選擇匹配用戶在所有4個表中一次選擇的精細範圍的記錄。

煉油廠搜索示例將是...獲取表1中的所有記錄,其中價格介於25美元和50美元之間,並且表2記錄具有1-4之間的評級(來自任何年份/列),並且其中表3記錄有一個評級(從任何年份/列)在80 - 100之間,表4記錄的評級(從任何年份/列)在80 - 100之間。

任何關於如何設置它的性能儘可能?

+0

我們平均在初始搜索中討論了多少結果?將它們全部加載並使用JS進行過濾可能會更容易 - 使用MySQL跳過這些過濾,使用Javascript完成所有操作。當然,這取決於開始的記錄數量,因爲您不想讓瀏覽器停滯不前。 – BenOfTheNorth

回答

2

我的建議是使用不同的表結構。你應該合併表2,3和4成一個單一的ratings表的結構如下:

id | productID | companyID | year | rating 

然後,你可以重寫查詢爲:

SELECT * 
FROM products p 
JOIN ratings r ON p.id = r.productID 
WHERE p.price BETWEEN 25 AND 50 
    AND (
     (r.companyID = 1 AND r.rating BETWEEN 1 AND 4) 
     OR (r.companyID = 2 AND r.rating BETWEEN 80 AND 100) 
     OR (r.companyID = 3 AND r.rating BETWEEN 80 AND 100) 
    ) 

這樣的表現肯定會增加。此外,您的表格將隨着年限和公司數量的增加而更具可擴展性。

還有一件事:如果您的products表中有很多字段,那麼執行2個查詢而不是加入可能會更有用。這是因爲您正在提取冗餘數據 - 即使您只需要一次,每個連接的行都會有product的列。這是連接的一個副作用,並且可能存在一個性能閾值,其中查詢兩次比加入會更有用。這是由你來決定是否/何時是這種情況。

+0

感謝Grampa - 我改變了我的表格結構到你的建議,加載了新的查詢,並且一切都很快。謝謝! – Rmilligan2372