关于explain小问题

这是链接

http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/optimization.html#explain

这是里面关于explain的extral字段的参数

not exists

mysql能够对查询进行left join优化,发现1个匹配left join标准的行后,不再为前面的的行组合在该表内检查更多的行。

下面是一个可以这样优化的查询类型的例子:

select * 从t1 left join t2 on t1.id=t2.id

where t2.id is null;

假定t2.id定义为not null。在这种情况下,mysql使用t1.id的值扫描t1并查找t2中的行。如果mysql在t2中发现一个匹配的行,它知道t2.id绝不会为null,并且不再扫描t2内有相同的id值的行。换句话说,对于t1的每个行,mysql只需要在t2中查找一次,无论t2内实际有多少匹配的行。

请问这段话怎么理解 特别是 “mysql能够对查询进行left join优化,发现1个匹配left join标准的行后,不再为前面的的行组合在该表内检查更多的行。

left join1对多的时候不是返回多行吗 所以我不是很理解上面这些 请教大家 谢谢

回复讨论(解决方案)

那段话的意思是,join的时候,用t1.id(例如t1.id=1)在t2.id中寻找,如果找到t2.id不为空(例如t2.id=1),那么mysql则记录t2.id=1的记录。当下一次t1.id=2时,因为mysql知道t2.id=1那行记录肯定不是null,那么就会直接过滤,不执行扫描。

表t1

id name

1 a

2 b

表t2

id name

1 aa

2 bb

t1 left join t2 on t1.id=t2.id where t2.id not null

首先t1.id=1,在t2表中的id中寻找,找到t2.id=1匹配。

然后t2.id=2 ,在t2表中的id寻找,这时会直接过滤掉t2.id=1的记录不扫描。

那段话的意思是,join的时候,用t1.id(例如t1.id=1)在t2.id中寻找,如果找到t2.id不为空(例如t2.id=1),那么mysql则记录t2.id=1的记录。当下一次t1.id=2时,因为mysql知道t2.id=1那行记录肯定不是null,那么就会直接过滤,不执行扫描。

表t1

id name

1 a

2 b

表t2

id name

1 aa

2 bb

t1 left join t2 on t1.id=t2.id where t2.id not null

首先t1.id=1,在t2表中的id中寻找,找到t2.id=1匹配。

然后t2.id=2 ,在t2表中的id寻找,这时会直接过滤掉t2.id=1的记录不扫描。

大神 最后一句话你是说 t1.id=2 吗

explain 的 extral 列是报告,而不是参数

它记录了 mysql 对查询指令的具体行为

你可以这样测试一下 mysql 的行为
mysql_connect();
mysql_select_db(‘test’);
mysql_query(“create temporary table t1 (id int, name varchar(10))”);
mysql_query(“insert into t1 values (1, ‘a1’)”);
mysql_query(“insert into t1 values (2, ‘b1’)”);
mysql_query(“insert into t1 values (3, ‘c1’)”);
mysql_query(“create temporary table t2 (id int, name varchar(10))”);
mysql_query(“insert into t2 values (1, ‘a2’)”);
mysql_query(“insert into t2 values (3, ‘b2’)”);
foo(“select * from t1 left join t2 on t1.);
foo(“select * from t1 left join t2 on t1.);
function foo($sql) {
$rs = mysql_query($sql);
while($r = mysql_fetch_row($rs)) {
echo join(“\t”, $r), php_eol;
}
$rs = mysql_query(“explain $sql”);
while($r = mysql_fetch_assoc($rs)) {
print_r($r);
}
}我的 mysql 版本较低,并未出现文档中的内容
1 a1 1 a2
2 b1
3 c1 3 b2
array
(
[id] => 1
[select_type] => simple
[table] => t1
[type] => all
[possible_keys] =>
[key] =>
[key_len] =>
[ref] =>
[rows] => 3
[extra] =>
)
array
(
[id] => 1
[select_type] => simple
[table] => t2
[type] => all
[possible_keys] =>
[key] =>
[key_len] =>
[ref] =>
[rows] => 2
[extra] =>
)
1 a1 1 a2
3 c1 3 b2
array
(
[id] => 1
[select_type] => simple
[table] => t2
[type] => all
[possible_keys] =>
[key] =>
[key_len] =>
[ref] =>
[rows] => 2
[extra] => using where
)
array
(
[id] => 1
[select_type] => simple
[table] => t1
[type] => all
[possible_keys] =>
[key] =>
[key_len] =>
[ref] =>
[rows] => 3
[extra] => using where; using join buffer
)

Posted in 未分类