简单的MySQL子查询性能

时间:2012-09-11 08:42:15

标签: mysql performance optimization

考虑2个MySQL查询:

SELECT ue.userid,e.courseid 
FROM (SELECT id,courseid FROM mdl_enrol WHERE status = 0 AND courseid IN (46)) e 
INNER JOIN (SELECT enrolid,userid FROM mdl_user_enrolments ) ue ON ue.enrolid = e.id 
INNER JOIN (SELECT userid FROM mdl_userdata) ud ON ue.userid = ud.userid

-

SELECT ue.userid,e.courseid 
FROM mdl_enrol e 
INNER JOIN mdl_user_enrolments ue ON ue.enrolid = e.id 
INNER JOIN mdl_userdata ud ON ue.userid = ud.userid
WHERE e.status = 0 AND e.courseid IN (46)

底部查询比顶级查询快得多,但为什么呢?我已经读过为了提高性能,你应该只选择你需要的列。另外,对我来说,顶级查询应该表现得更好,因为在每次JOIN中,您都会减少要加入的数据量。显然,我对数据库如何工作的理解是错误的,但如果有人能够清除它,那将非常感激。 EXPLAIN还确认底部查询要快得多。

非常感谢。

1 个答案:

答案 0 :(得分:2)

在第一个查询中,mysql应该从mdl_enrol表和完整 mdl_user_enrolmentsmdl_userdata中选择一个子集到内存中。所以你在内存中选择了很多数据。完成后 - 您加入数据。如果没有足够的内存来放置所有数据,直到它加入并发送回客户端 - 那么就会创建硬盘驱动器上的临时表。很可能mysql优化器不够酷,无法修复您的错误并尝试改进执行计划。这就是为什么它很慢。

然而对于第二个查询,mysql知道它究竟需要选择什么,并且只选择少量的所需数据。在这种情况下,可以使用索引(假设已创建所有必需的索引)。所以它很快。