mysql - 简单 MySQL 子查询性能

标签 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 还证实底部查询要快得多。

非常感谢。

最佳答案

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

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

关于mysql - 简单 MySQL 子查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12365907/

相关文章:

mysql - Sphinx 仅返回完全匹配的内容

mysql - 数据库设计——一个链接表还是多个链接表?

php - 我需要在 ORDER BY 字段上添加索引吗?

optimization - 乘以许多数字,但止于零

c++ - 除了尾递归之外的尾调用优化?

mysql - 我必须显示不在 "timecard"表中的记录

python - 将两个矩阵划分为8个小矩阵的更快方法

c++ - 为什么将函数包装到 lambda 中可能会使程序更快?

performance - 平衡 HDFS -> HBase mapreduce 作业的想法

multithreading - 在 Julia 中使用多线程创建 JuMP 模型