2012-03-22 38 views
0

當我在我的數據庫中進行查詢時 - 如果用戶有10k個朋友,我遇到擴展問題 - 我爲2k個朋友用戶使用的查詢不會縮放這意味着需要很長時間來處理。Scailing for MySQL Queries(Straight_Join vs Inner Join)

典型的情況是,當用戶的朋友數達到一定的閾值時,我不得不使用STRAIGHT_JOIN來提取查詢,但是我需要編寫條件語句來先查看有多少朋友,然後從那裏開始。數據越多,查詢得到的越慢。

有沒有更好的方式來擴大你的查詢通過MySQL,所以他們的工作速度相同,無論生成多少數據或我生活在一個幻想的世界?

編輯:查詢如下:對照片

SELECT photos.photo_id, count(distinct photo_views.ip_address) as total_count 
FROM photos 
INNER JOIN friends on friends.friend_id = photos.user_id 
INNER JOIN photo_views on photos.photo_id = photo_views.photo_id 
WHERE friends.user_id = 1 and friends.approved = 1 
and photos.created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY) 
GROUP by photos.photo_id 
ORDER by total_count desc 

指標是:對朋友

[user_id, created_at, photo_id], [user_id], [photo_id] - PRIMARY 

指標爲:在photo_views

[user_id, approved], [friend_id], [user_id, friend_id] - PRIMARY 

指標是:

[photo_id] - PRIMARY 
+0

STRAIGHT_JOIN只是幫助,當你知道表的正確關係,並不希望引擎爲你思考。如果您可以發佈您試圖運行的查詢,則可能會有其他選項,例如更好的索引,或何時/何處調整WHERE子句等。 – DRapp 2012-03-22 14:57:43

+0

我剛剛添加了上面的查詢。 – gregavola 2012-03-22 15:07:56

回答

1

我會先與你的朋友開始作爲你的資格賽,所以它不會試圖將照片作爲覆蓋每個人的基礎......因爲你正在做一個(內部)加入,我會用straight_join例如:

SELECT STRAIGHT_JOIN 
     P.Photo_ID, COUNT(distinct PV.IP_Address) as Total_Count 
    FROM 
     Friends F 
     JOIN Photos P 
      ON F.Friend_ID = P.User_ID 
      AND P.Created_At >= date_Sub(now(), Interval 30 day) 
      JOIN Photo_Views PV 
       ON P.Photo_ID = PV.Photo_ID 
    WHERE 
      F.User_ID = 1 
     AND F.Approved = 1 
    GROUP BY 
     P.Photo_ID 
    ORDER BY 
     total_Count DESC 

這樣,您只會爲那些被批准的用戶啓動這些朋友。從那裏,加入到朋友的照片和日期是合格的......從這個,得到多少點擊每個視圖表

+0

這看起來非常好,並開始在查詢測試中氾濫。中低計數的用戶 - 腳本完美無缺。但是,一旦你開始進入15k朋友,查詢需要大約5秒的時間來處理。有任何想法嗎? – gregavola 2012-03-22 15:40:08

+0

@ gregavola,通過(photo_id,ip_address)爲您的photo_views添加索引。這可能會導致您的計數不同... – DRapp 2012-03-22 15:50:07

+0

我嘗試過這種方法,但仍需要大約4-5秒才能完成15k +朋友的使用。它在photo_views上使用所有正確的索引(user_id,is_approved)好友,(user_id) - 照片,(user_id,ip_address)。非常奇怪...... – gregavola 2012-03-23 12:37:40