2010-08-09 41 views
0

我有類似下面的數據模型:使查詢更高效的讀取

username | product1 | product2 
------------------------------- 
harold  abc  qrs 
harold  abc  def 
harold  def  abc 
kim  abc  def 
kim  lmn  qrs  
... 

username | friend_username 
--------------------------- 
john  harold 
john  kim 
... 

我想建立最頻繁的產品1至產品2的記錄有直方圖,僅限於給定的產品1號,並只限於約翰的朋友。因此,像:

做什麼約翰鏈接的朋友,爲產品1,當產品1 =「ABC」: 從朋友表中選擇所有的約翰的朋友。對於每一個朋友,計數和組的記錄,其中產品1 =「ABC」,排序結果在遞減順序編號:

Results: 
abc -> def (2 instances) 
abc -> qrs (1 instance) 

我知道我們可以做到在關係數據庫中的以下,但會有一些這種查詢將開始利用大量資源的閾值。用戶可能擁有大量的朋友記錄(500+)。如果每次用戶加載頁面時該查詢運行5次,我擔心我會很快耗盡資源。

是否有一些其他表可以引入到我的模型中,以減輕每次用戶希望看到直方圖故障時執行上述查詢的開銷?我所能想到的是在可能的情況下預先計算直方圖,以便讀取優化。

感謝您的任何想法

回答

0

這是你的查詢:

SELECT p.product2, 
     COUNT(p.product2) AS num_product 
    FROM PRODUCTS p 
    JOIN FRIENDS f ON f.friend_username = p.username 
        AND f.username = 'john' 
    WHERE p.product1 = 'abc' 
GROUP BY p.product2 
ORDER BY num_product DESC 

要處理5個產品,使用方法:

SELECT p.product1, 
     p.product2, 
     COUNT(p.product2) AS num_product 
    FROM PRODUCTS p 
    JOIN FRIENDS f ON f.friend_username = p.username 
        AND f.username = 'john' 
    WHERE p.product1 IN ('abc', 'def', 'ghi', 'jkl', 'mno') 
GROUP BY p.product1, p.product2 
ORDER BY num_product DESC 

這是相當簡單的,更可以向下篩選記錄由於是一個較小的數據集,運行得越快。

如果此查詢每次用戶加載頁面時運行5次,我擔心我的資源會很快耗盡。

我的第一個問題是爲什麼你會每頁運行一次以上的查詢。如果要覆蓋多個朋友,則可以更新我發佈的查詢,以便按照每個朋友或用戶的基礎披露產品的計數。

之後,我不知道查詢是否可以緩存。你真的需要多少新的數據 - 可以接受2個小時?如何6或12 ...我們都會的數據是瞬時的,但你需要權衡這一點與性能和作出決定。

+0

嗨,是的,我想展示一個頁面,例如5個產品。然後,需要爲每個產品運行一次上述查詢,以找出每個產品的直方圖。同意這些數據不需要*真的*新鮮。真的想知道我是否錯過了一些優化查詢的明顯策略。最後,我不認爲你必須檢查N個朋友對M product1記錄並將它們分組以建立直方圖。所以我們需要策略來防止這樣的查詢運行或者首先減少查詢。 – user291701 2010-08-09 02:36:52

+0

@ user291701:我更新了答案,包括如何一次查詢5種產品。我將'product1'添加到輸出中,以便知道'product2'值和計數與'product1'值相關聯。 – 2010-08-09 02:54:08

+0

謝謝你的幫助。 – user291701 2010-08-09 14:15:42