首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过多个子查询加速mysql查询

通过多个子查询加速mysql查询
EN

Stack Overflow用户
提问于 2011-04-12 19:39:31
回答 3查看 2.9K关注 0票数 0

我想知道是否有一种方法可以加速按多个子查询排序的mysql查询。

在一个与音乐相关的网站上,用户可以喜欢不同的东西,如艺术家,歌曲,专辑等。这些“喜欢”都存储在同一个表中。现在我想要显示一个艺术家列表,按用户朋友和所有用户的“赞”数排序。我想展示所有的艺术家,以及那些根本没有喜欢的人。

我有以下疑问:

代码语言:javascript
复制
SELECT `artists`.*, 

    // friend likes
    (SELECT COUNT(*)
     FROM `likes`
     WHERE like_type = 'artist'
     AND like_id = artists.id
     AND user_id IN (1,2,3,4, etc) // ids of friends
     GROUP BY like_id
    ) AS `friend_likes`, 

    // all likes
    (SELECT COUNT(*)
     FROM `likes`
     WHERE like_type = 'artist'
     AND like_id = artists.id
     GROUP BY like_id
    ) AS `all_likes`

FROM artists
ORDER BY 
    friend_likes DESC, 
    all_likes DESC, 
    artists.name ASC

在一个2000行的艺术家表上,查询耗时±1.5秒。随着桌子变得越来越大,我担心这需要越来越长的时间。我尝试过使用JOINS by,但似乎不能正常工作,因为子查询包含WHERE语句。

任何正确方向的想法都将不胜感激!

EN

回答 3

Stack Overflow用户

发布于 2011-04-12 19:48:03

尝试使用JOIN%s而不是子查询:

代码语言:javascript
复制
SELECT
  artists.*, -- do you really need all this?
  count(user_id) AS all_likes,
  sum(user_id IN (1, 2, 3, 4)) AS friend_likes
FROM artists a
LEFT JOIN likes l
  ON l.like_type = 'artist' AND l.like_id = a.id
GROUP BY a.id
ORDER BY 
  friend_likes DESC, 
  all_likes DESC, 
  artists.name ASC;

如果这不能加快查询速度,请尝试添加索引,或者考虑选择更少的字段。

票数 3
EN

Stack Overflow用户

发布于 2011-04-12 19:44:48

你需要把它分解一下,看看时间都到哪里去了。您完全正确,在2000行上运行1.5秒不会很好地伸缩。我怀疑您需要查看索引和外键关系。分别查看每个count/group-by查询,将它们调优为您可以重新组合的最佳状态。

票数 0
EN

Stack Overflow用户

发布于 2011-04-12 20:40:36

尝试使用inline IF()滚动到查询中,并遍历表/连接一次

代码语言:javascript
复制
SELECT STRAIGHT_JOIN
  artists.*
  , LikeCounts.AllCount
  , LikeCounts.FriendLikeCount
FROM  
  (SELECT
    like_id
    , count(*) AllCount
    , sum( If( User_id in ( 1, 2, 3, 4 ), 1, 0 ) as FriendLikeCount
  FROM
    friend_likes
  WHERE
    like_type = 'artist'
  GROUP BY 
    like_id ) LikeCounts
JOIN artists ON LikeCounts.like_id = artists.id
ORDER BY
  LikeCounts.FriendLikeCount DESC
  , LikeCounts.AllCount DESC
  , artists.name ASC
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5634558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档