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