首页 > 解决方案 > 为什么sql中的这个表连接类型是ALL?

问题描述

我正在尝试查询课程1分数优于课程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
数据库结构: l

标签: mysqlsql

解决方案


如果数据库在索引的帮助下搜索一行,它遵循以下步骤:

  1. 在索引中搜索行(“索引查找”)
  2. 使用索引中的信息循环表中的行(“查找”)

对于少量行,这些步骤非常快。但是,如果您必须经常这样做,它们就会加起来。对于返回表中所有行的查询,此方法退化为非常长的运行时间。

仅仅读取完整的表(“表扫描”)是相反的:它对于大量的行来说很快。您不必搜索,也不必进行查找。

根据经验,当一个数据库期望一个连接需要超过 100 次查找时,它更喜欢全表扫描。


推荐阅读