SQL查询需要很长时间才能执行

时间:2015-07-20 15:10:07

标签: php mysql sql database

我已经研究了其他问题并尝试了他们的解决方案,但没有人帮助过我。如何降低此查询的执行时间?

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

非常感谢你。

1 个答案:

答案 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;

这应该利用上面的索引,没有"文件排序"放慢脚步的步伐。

相关问题