mysql - 使用多个子查询加速 mysql 查询

标签 mysql optimization subquery

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

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

我有以下查询:

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 秒。随着 table 越来越大,这个时间恐怕会越来越长。我尝试使用 JOINS by 似乎无法正常工作,因为子查询包含 WHERE 语句。

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

最佳答案

尝试使用JOIN代替子查询:

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;

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

关于mysql - 使用多个子查询加速 mysql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5634558/

相关文章:

MySQL - 在已连接的表上连接表

php - Laravel 5 添加条件子句查询

mysql - 优化MySQL中的子子查询

sql - 该子查询出错

c - 使用 C 程序在窗口中查看图像?

c++ - 与神秘指针相关的多线程速度减慢

mysql - SQL:带有复杂子查询的查询

mysql - 如何根据codeigniter下拉菜单中选定的文本选择id

mysql - 按一个字段的时间顺序对行进行排序,然后按另一字段的时间顺序对行进行排序

php - 使用 php 或 MySql 将时间戳转换为 DateTime