我正在尝试查询类(class) 1 成绩优于类(class) 2 的学生。这是我的 sql。
SELECT sc1.score C1Score, sc2.score C2Score,s.SId ID, s.Sname Name, s.Sage Age, s.Ssex Sex
FROM sc sc1 INNER JOIN sc sc2
ON sc1.SId = sc2.SId
AND sc1.CId = '01'
AND sc2.CId = '02'
AND sc1.score > sc2.score
INNER JOIN student s
ON s.SId = sc1.SId
;
sql解释结果:
表student
连接类型是all。当我说:ON s.SId = sc1.SId
时为什么要进行全表扫描
数据库结构:
最佳答案
如果数据库在索引的帮助下搜索一行,它会遵循以下步骤:
- 在索引中搜索该行(“索引查找”)
- 使用索引中的信息来循环表中的行(“查找”)
这些步骤对于少量行来说非常快。但如果你必须经常这样做,它们就会加起来。对于返回表中所有行的查询,此方法会退化为非常长的运行时间。
只读取整个表(“表扫描”)是相反的:对于大量的行来说速度很快。您不必搜索,也不必进行查找。
根据经验,当数据库预计连接需要超过 100 次查找时,它更喜欢全表扫描。
关于mysql - 为什么这个sql中的table join type是ALL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58540186/