gpt4 book ai didi

mysql - 在内连接之前使用子查询更有效?

转载 作者:行者123 更新时间:2023-11-29 00:28:20 24 4
gpt4 key购买 nike

我刚开始学习MYSQL,一直有一些疑惑。

让我们来看这个简单的场景:一个假设的在线类(class)网站,由 4 个表组成:学生、教师、类(class)和注册(学生注册的每个类(class)一个条目)

您可以找到数据库生成代码 on github .

虽然为清楚起见提供的数据库很小,但为了使其与我需要帮助的内容相关,我们假设这是一个足够大的数据库,效率将是一个真正的问题 - 假设有数十万学生,教师等



据我对 MYSQL 的理解,如果我们想要一张由“Charles Darwin”教授的学生表,一个可能的查询是这样的:

方法一

SELECT Students.name FROM Teachers
INNER JOIN Courses ON Teachers.id = Courses.teacher_id
INNER JOIN Registrations ON Courses.id = Registrations.course_id
INNER JOIN Students ON Registrations.student_id = Students.id
WHERE Teachers.name = "Charles Darwin"

这确实返回了我们想要的。

+----------------+
| name |
+----------------+
| John Doe |
| Jamie Heineman |
| Claire Doe |
+----------------+


所以这是我的问题:

以我(非常)有限的 MYSQL 知识,在我看来,我们在这里是 JOIN-ing 元素到教师表,它可能非常大,而我们最终只是在一个老师,我们在查询的最后过滤掉了谁。

我的“直觉”说,首先为我们需要的教师获取一行,然后将剩余的内容加入其中会更有效率:

方法二

SELECT Students.name FROM (SELECT Teachers.id FROM Teachers WHERE Teachers.name = 
"Charles Darwin") as Teacher
INNER JOIN Courses ON Teacher.id = Courses.teacher_id
INNER JOIN Registrations ON Courses.id = Registrations.course_id
INNER JOIN Students ON Registrations.student_id = Students.id

但事实真的如此吗?假设有几千个师生,这样是不是比第一个查询效率更高?可能是 MYSQL 足够聪明,能够以更有效地运行的方式解析方法 1 查询。


此外,如果有人可以建议更有效的查询,我也很想听听。

注意:我以前读过使用 EXPLAIN 来计算查询的效率,但我对 MYSQL 的理解不够深入,无法破译结果。此处的任何见解也将不胜感激。

最佳答案

My 'Intuition' Says that it would be much more efficient to first get a single row for the teacher we need, and then join the remaining stuff onto that instead:

通过使用谓词 Teachers.name = "Charles Darwin",您将在方法 1 中为教师获取一行。查询优化器应该确定在连接其他表之前使用此谓词限制 Teacher 集会更有效。

如果您不信任优化器或想减少它所做的工作,您甚至可以使用 SELECT STRAIGHT_JOIN ...STRAIGHT_JOIN 强制表读取顺序而不是 INNER_JOIN 以确保 MySQL 按照您在查询中指定的顺序读取表。

您的第二个查询结果相同,但效率可能较低,因为为您的教师子查询创建了一个临时表。

EXPLAIN documentation是关于如何解释 EXPLAIN 输出的很好的来源。

关于mysql - 在内连接之前使用子查询更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17870232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com