我已经研究了其他问题并尝试了他们的解决方案,但没有人帮助过我。如何降低此查询的执行时间?
SELECT c.id,c.title,c.time,u.username, (SELECT time FROM comments_read as io WHERE io.id=c.id AND io.uid=$logged_userid LIMIT 1) as read_time
FROM comments as c
LEFT JOIN users u ON u.uid=c.uid
WHERE c.deleted=0
ORDER by c.time DESC
LIMIT 20
非常感谢你。
答案 0 :(得分:2)
这是您的查询:
SELECT c.id, c.title, c.time, u.username,
(SELECT io.time
FROM comments_read as io
WHERE io.id = c.id AND
io.uid = $logged_userid
LIMIT 1
) as read_time
FROM comments as c LEFT JOIN
users u
ON u.uid = c.uid
WHERE c.deleted = 0
ORDER by c.time DESC
LIMIT 20;
索引可用于提高性能。我会从comments(deleted, time, uid, id)
,users(uid)
和comments_read(id, uid, time)
开始。
注意:通常不鼓励使用LIMIT
而不使用ORDER BY
,因为结果不稳定。你可以获得任何匹配的行。
编辑:
如果上述索引没有帮助,他们可能会被JOIN
弄糊涂。你可以做同样的事情:
SELECT c.id, c.title, c.time,
(SELECT u.username FROM users u WHERE u.uid = c.uid) as username,
(SELECT io.time
FROM comments_read as io
WHERE io.id = c.id AND
io.uid = $logged_userid
LIMIT 1
) as read_time
FROM comments as c
WHERE c.deleted = 0
ORDER by c.time DESC
LIMIT 20;
这应该利用上面的索引,没有"文件排序"放慢脚步的步伐。