我有三个表,包含以下字段:
类:class_id |名字|等级
classes_students :class_id | student_id数据
学生:student_id |名字
课程与学生有n:m的关系,所以一个班级可以有很多学生,一个学生可以听很多班级。我想选择特定班级的所有学生,其中class_id为5。
以下是三个执行相同操作的查询。我运行MySQL最新版本,InnoDB引擎。哪一个会表现出更好的表现?为什么?
查询A)
SELECT s.name
FROM students s
JOIN classes_students cs ON cs.student_id = s.student_id AND cs.class_id = 5
查询B)
SELECT s.name
FROM students s
JOIN classes_students cs ON cs.student_id = s.student_id
JOIN classes c ON c.class_id = cs.class_id
WHERE c.class_id = 5
查询C)
SELECT s.name
FROM students s
INNER JOIN classes_students cs ON cs.student_id = s.student_id
WHERE cs.class_id = 5
答案 0 :(得分:3)
唯一真正的了解方法是尝试所有这些,并比较环境的性能。 始终在您的环境中测试查询,对它们进行基准测试以查看实际上最佳的效果,否则您将永远不会真正知道。
一般来说,假设所有索引都已到位,我预计B会变得更糟,因为它涉及更多的JOIN /更多表。 A和C我希望是相同的(可能会针对相同的执行计划进行优化)
答案 1 :(得分:1)
MySQL提供了 EXPLAIN 语句,详细说明了执行计划。
我没有运行它,但我的赌注是三个查询的处理方式完全相同。
如果你真的需要调整MySQL优化器,可以查看STRAIGHT_JOIN运算符,但MySQL通常非常聪明。