2012-02-26 41 views
0

我想弄清楚如何以最有效的方式做到這一點,因爲我有大表。如何高效地計數mysql上的事件

我有兩個表:photosfavorites(想想像Flickr或Facebook :-)。

對於每張照片P,我希望P上傳者在她上傳照片之前收到的P的創作者總數的總數。換句話說,我想要提交直到她分享的時刻P.

photos包括列:id,user_id,upload_timestamp

favorites包括列:photo_iduser_id(用戶的最愛項目),fave_timestamp

結果集應該有列:photo_id, user_id (creator of the photo), pre_faves_count

photos表有200萬條記錄。 favorites有1000萬條記錄。

我試圖做這樣的事情

select count(favorites) 
FROM favorites, photos 
WHERE favorites.photo_id 
    and photos.id 
    and favorites.fave_timestamp < photos.upload_timestamp 
group by favorites.photo_id, favorites.user_id 

- 但我敢肯定

+0

您有哪些索引? – 2012-02-26 23:29:27

+0

我有每個表的ID的索引。 – amh 2012-02-26 23:49:25

+0

我已經嘗試做像選擇計數(收藏夾)從'收藏夾','照片'WHERE favorites.photo_id和photos.id和favorites.fave_timestamp amh 2012-02-27 00:43:36

回答

1

這將是很慢這不正確。甚至不要在2M和10M桌面上嘗試它,而無需先添加索引:

SELECT 
     p.id    AS photo_id 
    , p.user_id   AS user_id 
    , COUNT(f.photo_id) AS pre_faves_count 
FROM 
     photos AS p 
    JOIN 
     photos AS allp 
      ON allp.user_id = p.user_id 
    LEFT JOIN 
     favorites AS f 
      ON f.photo_id = allp.id 
      AND f.fave_timestamp < p.upload_timestamp 
GROUP BY 
     p.id 
    , p.user_id 
+0

謝謝。我想我想到了一個更快的方法:從照片中選擇photos.id,photos.user_id,(從收藏夾中選擇count(*),其中favorites.user_id = photos.user_id和favorites.fav_timestamp amh 2012-02-27 01:53:46

+0

@andersmh:你想計算一個已經收到的投票(我的查詢)或者投票的結果(你的查詢,一個加入需要)? – 2012-02-27 02:35:30

+0

啊,你說得對,我的查詢是錯的:-)謝謝! – amh 2012-03-01 23:49:50

相關問題