【发布时间】:2011-04-12 11:39:30
【问题描述】:
我想知道是否有一种方法可以加快由多个子查询排序的 mysql 查询。
在与音乐相关的网站上,用户可以喜欢不同的东西,例如艺术家、歌曲、专辑等。这些“喜欢”都存储在同一个表中。现在我想显示按用户朋友和所有用户的“喜欢”数量排序的艺术家列表。我想向所有艺术家展示,包括那些根本没有点赞的人。
我有以下疑问:
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 似乎无法正常工作,因为子查询包含 WHERE 语句。
任何正确方向的想法将不胜感激!
【问题讨论】:
-
在其他人之前 - 将 EXPLAIN 放在 SELECT 语句之前会得到什么?
-
您是否已将艺术家表中的连接列编入索引?
标签: mysql optimization subquery