考虑两个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)底部查询比顶部查询快得多,但是为什么呢?我读过为了提高性能,你应该只选择你需要的列。此外,对我来说,top查询应该执行得更好,因为在每个连接中,您减少了要连接的数据量。显然,我对数据库工作原理的理解是错误的,但如果有人能澄清这一点,我将不胜感激。EXPLAIN也证实了底层查询的速度要快得多。
非常感谢。
发布于 2012-09-11 16:46:07
在第一个查询中,mysql应该从mdl_enrol表中选择一个子集,并将完整的、mdl_user_enrolments和mdl_userdata放入内存。所以你在内存中选择了很多数据。在你做完这些之后--你连接数据。如果没有足够的内存来存放所有的数据,直到它被连接并发送回客户端,那么硬盘上的临时表就会被创建。很可能mysql优化器不够酷,不足以修复您的错误并尝试改进执行计划。这就是为什么它很慢的原因。
而对于第二个查询,mysql知道它到底需要选择什么,并且只选择了少量所需的数据。在这种情况下,可以使用索引(假设已经创建了所有必要的索引)。所以它很快。
https://stackoverflow.com/questions/12365907
复制相似问题