使用LEFT JOIN进行慢速SQL查询

时间:2018-10-02 08:45:03

标签: mysql sql performance join

我已经读过类似的问题,但这对我没有帮助。

我有疑问

SELECT `login`, 
   `photo`, 
   `username`, 
   `user`.`id`, 
   `name`, 
   `msg_info` 
FROM   `user` 
       LEFT JOIN `friends` 
              ON `friends`.`child` = `user`.`fb_id` 
WHERE  `friends`.`parent` = '1111' 
ORDER  BY `msg_info` DESC 

花费了 0.7411 秒(甚至更多)

它显示总共 158行(好吧,我可以限制它,但是查询仍然很慢)

每个表 friends user 的表都超过200.000行

我该如何做才能使查询更快?

谢谢!

2 个答案:

答案 0 :(得分:0)

正如评论所指出的那样,您的左联接确实与以下内部联接查询没有区别:

SELECT
    login,
    photo,
    username,
    user.id,
    name,
    msg_info
FROM user u
INNER JOIN friends f
    ON f.child = u.fb_id
WHERE
    f.parent = '1111'
ORDER BY
    msg_info DESC;

我们可以尝试向friends上的(parent, child, name, msg_info, ...)表添加索引。我不确定其他哪些列属于friends,但是基本思想是在parent上创建索引,以加快WHERE子句,并希望利用低基数的优势。 parent列。然后,我们包含child列以加快连接速度。我们还将所有其他列都包含在select子句中,以使索引覆盖我们需要的其他列。

CREATE INDEX idx ON friends (parent, child, name, msg_info, ...);

答案 1 :(得分:0)

As @MrVimes suggeted, sometimes adding a condition to the JOIN clause can make a big difference:

SELECT login, photo, username, user.id, name, msg_info
FROM user u
INNER JOIN friends f ON f.child = u.fb_id AND f.parent = '1111'
ORDER BY msg_info DESC;

Assuming, of course, all your PK and FKs are properly defined and indexed.