Mysql查询优化

Mysql查询优化,mysql,Mysql,您好,我正在运行socialengine3,需要对自定义的好友查询进行优化。 它目前需要15秒来执行 朋友桌 朋友身份证 朋友\用户\ id1 朋友\用户\ id2 朋友身份 朋友型 使用者 用户id 编辑 我已将其转换为exists,但它现在仍在20秒内执行 下面是更新后的查询 SELECT friendlist.friend_user_id2, se_users.username, se_users.id, se_users.image, se_users.name, se_users.s

您好,我正在运行socialengine3,需要对自定义的好友查询进行优化。 它目前需要15秒来执行

朋友桌

朋友身份证 朋友\用户\ id1 朋友\用户\ id2 朋友身份 朋友型

使用者

用户id

编辑 我已将其转换为exists,但它现在仍在20秒内执行

下面是更新后的查询

 SELECT friendlist.friend_user_id2, se_users.username, se_users.id, se_users.image, se_users.name, se_users.surname, count( * ) AS mutral_friends
 FROM `se_friends` friendlist
 INNER JOIN `users` se_users ON friendlist.friend_user_id2 = `se_users`.id
 WHERE EXISTS (

    SELECT se.friend_user_id2
    FROM se_friends se
    WHERE se.friend_user_id1 = '105012'
    AND se.friend_status = '1'
    AND se.friend_user_id2 = friendlist.friend_user_id1
 ) AND NOT EXISTS (
    SELECT se1.friend_user_id2
    FROM `se_friends` se1
    WHERE se1.friend_user_id1 = '105012'
    AND friendlist.friend_user_id2 = se1.friend_user_id2
 )
 AND NOT (
    friendlist.friend_user_id2 = '105012'
 )
 AND friendlist.friend_status = '1'
 GROUP BY friendlist.friend_user_id2, se_users.username, se_users.id, se_users.image,         se_users.name, se_users.surname
 ORDER BY mutral_friends DESC
 LIMIT 0 , 20 
原始查询 这是一项非常昂贵的操作。 尝试用EXISTS替换它。乙二醇


如果没有帮助,最好查看执行计划

尝试在选择中重写子查询。。。正是。这可能会让他从第一个选择中删除DISTINCT,这也是昂贵的groupby+DISTINCT。
SELECT DISTINCT `se_friends`.friend_user_id2, se_users.username, se_users.id, se_users.image, se_users.name, se_users.surname, count(*) as mutral_friends
            FROM `se_friends`
            INNER JOIN `users` se_users` ON `se_friends`.friend_user_id2=`se_users`.id
            WHERE 
              (se_friends.friend_user_id1 <> '30355' or se_friends.friend_user_id2 <> '30355') AND

                se_friends.friend_user_id1 IN 
                (SELECT se_friends.friend_user_id2
                 FROM `se_friends`
                 WHERE se_friends.friend_user_id1='".$user_id."'  AND se_friends.friend_status='1')
            AND `se_friends`.friend_user_id2 NOT IN
                (SELECT se_friends.friend_user_id2
                FROM `se_friends`
                WHERE se_friends.friend_user_id1='".$user_id."'
                )
            AND NOT(se_friends.friend_user_id2='".$user_id."') AND se_friends.friend_status='1' 
            GROUP BY `se_friends`.friend_user_id2, se_users.username, se_users.id, se_users.image, se_users.name, se_users.surname
            ORDER BY  mutral_friends DESC 
            LIMIT 0, 20
select * from table where user_id in (select user_id from users where active='A')
select * from table t where exists (select user_id from users u where t.user_id = u.user_id and u.active='A')