Mysql 带有连接的慢速查询

Mysql 带有连接的慢速查询,mysql,join,Mysql,Join,请注意,我在优化此查询时遇到困难。我试图实现的是连接大约8个表,其中只有大约3个表包含大数据(150万条记录)。此查询返回预期记录,但运行需要1分钟,这是错误的。 我知道它可以优化,以执行更好的,请我需要从您的专家协助。我已经在用于联接的字段上建立了索引 SELECT topic_id, topic_title, unit_name_abbrev, sch_name_abbrev, picture_small_url AS thumbnail, pr

请注意,我在优化此查询时遇到困难。我试图实现的是连接大约8个表,其中只有大约3个表包含大数据(150万条记录)。此查询返回预期记录,但运行需要1分钟,这是错误的。 我知道它可以优化,以执行更好的,请我需要从您的专家协助。我已经在用于联接的字段上建立了索引

SELECT topic_id, 
   topic_title, 
   unit_name_abbrev, 
   sch_name_abbrev, 
   picture_small_url    AS thumbnail, 
   profile_pix_upload_path, 
   first_name, 
   last_name, 
   topic_poster, 
   topic_replies, 
   topic_views, 
   topic_last_post_time AS topic_post_time, 
   sch_sub_forum_id 
FROM   (_sch_forum_topics 
    INNER JOIN _users 
            ON ( _users.userid = _sch_forum_topics.topic_poster ) 
    INNER JOIN _profile 
            ON _profile.userid = _users.userid 
    INNER JOIN _class 
            ON _users.classid = _class.classid 
    INNER JOIN _level 
            ON _class.level_id = _level.id 
    INNER JOIN _unit 
            ON _class.unitid = _unit.unitid 
    INNER JOIN _department 
            ON _unit.deptid = _department.deptid 
    INNER JOIN _faculty 
            ON _department.facid = _faculty.facid 
    INNER JOIN _university 
            ON _faculty.schid = _university.schid) 
WHERE  _sch_forum_topics.sch_sub_forum_id = 4 
ORDER  BY _sch_forum_topics.topic_last_post_time DESC 
LIMIT  0, 15 

尝试在加入之前进行筛选

SELECT topic_id, 
   topic_title, 
   unit_name_abbrev, 
   sch_name_abbrev, 
   picture_small_url    AS thumbnail, 
   profile_pix_upload_path, 
   first_name, 
   last_name, 
   topic_poster, 
   topic_replies, 
   topic_views, 
   topic_last_post_time AS topic_post_time, 
   sch_sub_forum_id
FROM
 ( select  * FROM  sch_forum_topics WHERE sch_sub_forum_id = 4
ORDER BY topic_last_post_time DESC 
LIMIT  0, 15 ) main
    INNER JOIN _users 
            ON ( _users.userid = main.topic_poster ) 
    INNER JOIN _profile 
            ON _profile.userid = _users.userid 
    INNER JOIN _class 
            ON _users.classid = _class.classid 
    INNER JOIN _level 
            ON _class.level_id = _level.id 
    INNER JOIN _unit 
            ON _class.unitid = _unit.unitid 
    INNER JOIN _department 
            ON _unit.deptid = _department.deptid 
    INNER JOIN _faculty 
            ON _department.facid = _faculty.facid 
    INNER JOIN _university 
            ON _faculty.schid = _university.schid);

尝试将where子句上的内部联接移到外部,并检查索引。另外,查询显示的
EXPLAIN
是什么?发布一个EXPLAIN输出最有可能它有许多记录要分析,查询最有可能需要“使用临时;使用文件排序”;因为MySQL优化器是基于成本的,所以它最有可能访问错误的表顺序。删除order by子句,看看它是否运行良好,如果是,请按子句的顺序在列上放置索引如果此查询由某个后端脚本调用,则通常会有一种不同的技术,即缓存相关对象,然后通过id检索它们。最好避免在DB realtime上执行复杂的查询,是的,当我删除ORDERBY子句时,性能有所提高。但是子句使用的字段已经被索引。这是一个时间戳字段。此查询与原始查询不同。我相信您在加入之前申请的限制与加入之后申请的限制不同。是的,由于限制,我也必须订购。现在,我这样做了,应该与原始查询没有区别。除了查询的速度慢之外,没有其他错误。查询仍然非常慢。您是否可以对此查询运行explain并发布输出?