首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单的MySQL子查询性能

问简单的MySQL子查询性能
EN

Stack Overflow用户
提问于 2012-09-11 16:42:15
回答 1查看 2.4K关注 0票数 1

考虑两个MySQL查询:

代码语言:javascript
复制
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

--

代码语言:javascript
复制
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也证实了底层查询的速度要快得多。

非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-11 16:46:07

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12365907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档