Mysql查询优化
您好,我正在运行socialengine3,需要对自定义的好友查询进行优化。 它目前需要15秒来执行 朋友桌 朋友身份证 朋友\用户\ id1 朋友\用户\ id2 朋友身份 朋友型 使用者 用户id 编辑 我已将其转换为exists,但它现在仍在20秒内执行 下面是更新后的查询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
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')