Mysql查询:查找用户后跟或跟随其他用户的最快方法

时间:2015-03-24 19:02:24

标签: mysql

我有以下表格:

关系

idfollower_idfollowee_idstatus

用户

idnameemail

我想找到所有跟踪或关注特定用户的用户。

这是我到目前为止所做的,但速度很慢:

SELECT DISTINCT
    `users`.*
FROM
    `users`
        INNER JOIN
    `relationships` ON ((`users`.`id` = `relationships`.`follower_id`
        AND `relationships`.`followee_id` = 1)
        OR (`users`.`id` = `relationships`.`followee_id`
        AND `relationships`.`follower_id` = 1))
WHERE
    `relationships`.`status` = 'following'
ORDER BY `users`.`id`

我的意思是慢

我有一个用户拥有大约600个关注者和600个关注者,此查询运行大约需要5秒钟,这些数字看起来非常慢!

explain方法显示以下内容:

+----+-------------+---------------+------+-----------------------------------------------------------------------+------+---------+------+------+------------------------------------------------+
| id | select_type | table         | type | possible_keys                                                         | key  | key_len | ref  | rows | Extra                                          |
+----+-------------+---------------+------+-----------------------------------------------------------------------+------+---------+------+------+------------------------------------------------+
|  1 | SIMPLE      | relationships | ALL  | index_relationships_on_followed_id,index_relationships_on_follower_id | NULL | NULL    | NULL |  727 | Using where; Using temporary; Using filesort   |
|  1 | SIMPLE      | users         | ALL  | PRIMARY                                                               | NULL | NULL    | NULL |  767 | Range checked for each record (index map: 0x1) |
+----+-------------+---------------+------+-----------------------------------------------------------------------+------+---------+------+------+------------------------------------------------+

1 个答案:

答案 0 :(得分:1)

尝试将此分为两个查询,union

SELECT u.*
FROM `users` u INNER JOIN
     `relationships` r
      ON u.`id` = r.`follower_id` AND r.`followee_id` = 1
WHERE `r.`status` = 'following'
UNION
SELECT u.*
FROM `users` u INNER JOIN
     `relationships` r
      ON u.`id` = r.`followee_id` AND r.`follower_id` = 1
WHERE `r.`status` = 'following'
ORDER BY id;

这可能是更复杂的查询具有更好性能的情况。这些查询也将受益于索引:relationships(status, follower_id, followee_id)relationships(status, followee_id, follower_id)