我已经读过类似的问题,但这对我没有帮助。
我有疑问
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行
我该如何做才能使查询更快?
谢谢!
答案 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.