当使用“ORDER BY”时,大咨询速度很慢

时间:2011-01-15 15:50:53

标签: mysql sql

我在论坛结构中订购一系列“主题”时遇到问题,当我查询生成一个列表(在数百万条记录中)如此之快(0.12秒),但是当我添加“ORDER BY”时命令DESC“查询需要1分钟。

        SELECT 
        forum_topics.id AS id,
        forum_topics.slug AS slug, 
        forum_topics.user_id AS user_id, 
        forum_topics.forum_id AS forum_id, 
        forum_topics.title AS title,
        forum_topics.total_post AS total_post,  
        forum_topics.total_view AS total_view,
        forum_topics.last_post_id AS last_post_id,
        forum_topics.created AS created,
        forum_topics.modified AS modified,
        forum_topics.ordered AS ordered, 
        forum_topics.status_close AS status_close,
        forum_topics.status_view AS status_view, 
        t_users.id AS topic_user_id, 
        t_users.nick AS user_nick, 
        p_users.id AS post_user_id, 
        p_users.nick AS post_user_nick,
        forum_posts.title AS post_title, 
        forum_posts.created AS post_created 
        FROM forum_topics 
        LEFT JOIN forum_posts ON forum_topics.last_post_id = forum_posts.id 
        LEFT JOIN users AS t_users ON forum_topics.user_id = t_users.id 
        LEFT JOIN users AS p_users ON forum_posts.user_id = p_users.id 
        WHERE forum_topics.forum_id = '9' AND forum_topics.status_highlight = '0' 
        LIMIT 0,100

有关如何订购此超级表而不失性能的任何想法? 注意:所有“id”(PRIMARY)和“* _id”都是索引,作为“有序”字段,它是一个unix时间戳INT(15)

由于

2 个答案:

答案 0 :(得分:1)

使用LIMIT而不使用ORDER BY可以让系统获取任意100条记录,因此它会先找到它。

添加ORDER BY表示您需要大约100条特定记录 - 因此必须准确搜索这些记录。

如何解决?

尝试FORUM_TOPICS (forum_id, status_highlight, ordered)上的索引,该索引已经按照ORDER BY所需的顺序 - 因此,索引中的第一个(或最后一个)记录是您要求的记录,因此DB可以立即使用它们。

答案 1 :(得分:0)

有序字段上的索引(时间戳一 - 你有3:创建,修改,订购)和stauts_highlight不会受到伤害(如果它是主要的条件)