繁体   English   中英

如何优化此查询以更快地执行?

[英]How can I optimize this query to execute faster?

这是我网站上的“朋友”模块,用户可以在此彼此结交朋友。 这些存储在“ friends:”表中,发起友谊的人为philips_inviter,处于批准/拒绝结果的人为friendhsip_accepter

SELECT user_id, user_name, user_gender
FROM friends
LEFT JOIN users
    ON (   users.user_id = friends.friendship_inviter 
        OR users.user_id = friends.friendship_accepter)
WHERE (friendship_inviter = '125' OR friendship_accepter = '125') 
AND    user_id !='125' 
AND    friendship_level = 1;

这将进行全表扫描,即使表不大(15,000个用户,3000个友谊),平均也要花费1-1.5秒。

如何以不增加服务器负担的方式输出当前朋友列表?

SELECT user_id, user_name, user_gender
FROM friends
LEFT JOIN users
    ON users.user_id = friends.friendship_accepter
WHERE  friendship_accepter = '125' 
AND    user_id !='125' 
AND    friendship_level = 1
UNION 
SELECT user_id, user_name, user_gender
FROM friends
LEFT JOIN users
    ON users.user_id = friends.friendship_inviter
WHERE friendship_inviter = '125'  
AND    user_id !='125' 
AND    friendship_level = 1;

当然,您似乎没有从“ friends”表中选择任何内容,并且WHERE子句中有多余的列,所以我实际上是写INNER JOINs,相当于您发布时的LEFT JOINs :

SELECT user_id, user_name, user_gender
FROM friends
INNER JOIN users
    ON users.user_id = friends.friendship_accepter
WHERE  friendship_accepter = '125' 
AND    user_id !='125' 
AND    friendship_level = 1
UNION 
SELECT user_id, user_name, user_gender
FROM friends
INNER JOIN users
    ON users.user_id = friends.friendship_inviter
WHERE friendship_inviter = '125'  
AND    user_id !='125' 
AND    friendship_level = 1;

将索引添加到WHERE子句和JOIN中使用的列/组合。

问题的一部分可能是友谊级别基数低。 有时,在低基数列上,查询优化器将决定仍然进行表扫描。

做一个EXPLAIN,并确保您的其他条件在执行FIRST之前,先在查询中考虑不友好级别条件。 满足前两个条件后扫描剩余的记录将花费更少的时间。

确保您已索引user_id, friendship_accepter, friendship_inviter and friendship_level philippe_level。

还是您发布的只是原始查询时间,或者它包括输出结果的时间? 如果它还包含输出,则可能不是查询较慢,而是输出。

可能使结果变慢的另一件事是,如果它是通过较慢的网络(即Internet)进行的。 延迟时间可能是因为这个原因,而不是因为查询。

我在社交网站上做的事情非常相似,但是我的有所不同,我为每个友谊插入2条记录,这使我可以显示用户;

待处理的好友请求发送了好友请求并确认了好友

我也不排除使用UNION的注意事项。 我目前在朋友表中大约有50,000个用户和超过100万行,这对我来说非常有用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM