ALiDan 2020-01-10
在学习sql,使用sql后,有时候不理解sql代码为什么这样写?如果能了解sql代码的运行,就能够深入理解了。
https://dev.mysql.com/doc/refman/8.0/en/nested-loop-joins.html
读取行,在一个循环内,从第一个表每次读一行x,并传递x到内部嵌套的循环(被join的下一个表格的处理)。
这个过程被重复多次,每次处理一个被join的表格。
??本质就是嵌套循环,一个表一个循环。层层嵌套。
例子:3个表关联。所以嵌套3层。
Table Join Type t1 range t2 ref t3 ALL for each row in t1 matching range { for each row in t2 matching reference key { for each row in t3 { if row satisfies join conditions, send to client } } }
问题? Join Type类型不理解
https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#jointype_all
优化的算法。
explain声明提供了MYsql如何执行一个声明的详细信息。
比如select声明,explain会返回:每个表一行信息。
Mysql使用nested-loop join方法来处理所有的join连接。因此,mysql会从第一个表读一行数据,然后在第二个表找到一个匹配的行数据,在然后去往第三个表。。。当所有的表都被处理,Mysql会输出被选择的列,然后返回到上一个表,寻找更多的匹配行。
??上面的过程,就是嵌套循环处理的过程。
下面的图,显示了explain声明中常用的输出列的信息:
explain用JSON格式来描述:
每一个输出列都提供了一个表格的信息。简单的说明见:Table 8.1, “EXPLAIN Output Columns”
select_type:
SELECT
key:
key/index,Mysql实际决定使用的。
ref:
尚未理解。
rows:
Mysql估计执行查询时会被检测的行的数量。使用InnoDB引擎,这是一个估计值。
filtered:
由表的筛选条件而被检索的row的数量占表格所有行的比例。
最大值是100,表示没有进行筛选。