2

考虑 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 还确认底部查询要快得多。

非常感谢。

4

1 回答 1

4

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

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

于 2012-09-11T08:46:07.270 回答