mysql - 为什么这个sql中的table join type是ALL?

标签 mysql sql

我正在尝试查询类(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解释结果: enter image description herestudent 连接类型是all。当我说:ON s.SId = sc1.SId 时为什么要进行全表扫描
数据库结构: l

最佳答案

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

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

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

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

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

关于mysql - 为什么这个sql中的table join type是ALL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58540186/

相关文章:

mysql - 使用 Hibernate 和注释连接两个表和一个中间表

mysql - 使用 Raw mysql 从 ruby​​ on rails 检索数据得到意外

php - 加速非常慢的 PHP 脚本生成大型 JSON 数组的速度

java - mysql实时数据消耗

mysql - 使用 Not 条件在 MySQL 中分组

mysql - 太高的 MySQL innodb 缓冲池大小会导致内核交换守护进程 (kswapd0) 的高负载吗?

mysql - 将值转换为列 SQL

mysql - 删除mysql查询

用于连接两个表并提取重复条目的 SQL 查询

具有 NCHAR 列比较的 SQL Server LIKE 运算符