考虑 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 还证实底部查询要快得多。
非常感谢。
最佳答案
在第一个查询中,mysql应该从mdl_enrol
表中选择一个子集,并将完整mdl_user_enrolments
和mdl_userdata
放入内存。所以你在内存中选择了大量的数据。完成此操作后,您将加入数据。如果没有足够的内存来放置所有数据,直到将其连接并发送回客户端 - 则会在硬盘驱动器上创建临时表。很可能 mysql 优化器不够酷,无法修复您的错误并尝试改进执行计划。这就是为什么它很慢。
而对于第二个查询,mysql知道它到底需要选择什么,并且只选择所需的少量数据。在这种情况下,可以使用索引(假设已创建所有必要的索引)。所以速度很快。
关于mysql - 简单 MySQL 子查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12365907/