带左连接的慢速sql查询

8aqjt8rx  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(247)

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

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都有超过200000行
我能做些什么来加快查询速度?
谢谢您!

s5a0g9ez

s5a0g9ez1#

正如评论所指出的,您的左连接实际上与以下内部连接查询没有什么不同:

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, ...);
igetnqfo

igetnqfo2#

正如@mrvimes所建议的,有时向join子句添加一个条件会产生很大的不同:

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;

当然,假设您的所有pk和fk都已正确定义和索引。

相关问题