缩放MySQL查询(直接连接与内部连接)

时间:2012-03-22 14:52:11

标签: mysql

当我在我的数据库中进行查询时 - 我遇到了扩展问题,如果用户有10k的朋友 - 我用于2k朋友的用户的相同查询不会扩展,这意味着需要很长时间才能完成过程

典型的情况是,当用户的朋友数量达到某个阈值时,我不得不最终使用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

朋友的索引是:

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

photo_views上的索引是:

[photo_id] - PRIMARY

1 个答案:

答案 0 :(得分:1)

我会以你的朋友FIRST作为你的资格赛开始,所以它不会试图将照片作为覆盖所有人的基础......因为你正在进行(内部)联接,我会选择直接连接如:

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

这样,您只对那些获得批准的用户的朋友开始。从那里,加入到朋友的照片和日期是合格的...从那,获得每个视图表的点击次数