我正在开发一个评论系统,我已经提出了另一个关于here的问题。模式几乎相同,只是我在rating
表中添加了comments
列,并设置了一个触发器,以便在comments_ratings
表中发生更改时更新它,以避免每次我需要获取评论时计算评级。
因此,当我执行查询以获取最新评论时:
SELECT
c.*, COALESCE (COUNT(r.id), 0) AS replies
FROM
(
SELECT
...
FROM
comments c
LEFT JOIN users u ON u.id = c.author
LEFT JOIN comments_ratings crv ON crv.COMMENT = c.id
AND crv.USER = ?
WHERE
c.item = ?
AND c.type = ?
ORDER BY
c.id DESC
LIMIT 0,
10
) AS c
LEFT JOIN comments r ON c.id = r.reply
GROUP BY
c.id
ORDER BY
c.id DESC
我在0.001~0.003秒内得到一个结果,我可以确认缓存没有帮助我,因为我尝试用随机值进行限制,时间总是在这个范围内。
但是,如果我尝试按rating
而非c.id
进行排序,则查询需要30秒以上(我有大量测试数据)。当我打开探查器时,我发现它用于Copying to tmp table
的时间超过90%。我想它正在将整个表复制到内存表中并在那里进行排序,但我不明白为什么(如果)发生这种情况,因为我在列rating
上创建了一个索引,其中应该帮助?
我打破数据库规范化并创建rating
列而不是计算它的原因是能够对其进行索引以便于排序。
我现在很困惑,你看到我做错了吗?