排序导致大幅减速

时间:2015-07-21 17:27:09

标签: mysql

我正在开发一个评论系统,我已经提出了另一个关于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列而不是计算它的原因是能够对其进行索引以便于排序。

我现在很困惑,你看到我做错了吗?

0 个答案:

没有答案