(1)执行计划简单例子:
explain select * from t1
看下这个简单的SQL语句的执行计划什么样子?
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE | t1 | NULL | ALL | NULL | NULL | NULL | NULL | 3457 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
执行计划分析:<br /> select_type是SIMPLE,查询的类型很简单,<br /> table是t1,查询的表名是t1,type是all,就是全表扫描,因为没加任何where条件,只能是全表扫描。这里直接会扫描表的聚簇索引的叶子节点,按顺序扫描过去拿到表里的全部数据。<br /> rows是3457,说明全表扫描这个表的3457条数据,说明这个表里有3457条数据,此时全表扫描会全部扫描出来,filtered是100,由于没有任何where过滤条件,所以直接筛选出来的数据就是表里数据的100%占比。
(2)join的SQL语句执行计划:
explain select * from t1 join t2
这个是典型的多表关联语句,这种关联语句,实际上会选择一个表先查询出来数据,接着遍历每一条数据去另外一个表里查询可以关联在一起的数据,然后关联起来,看下执行计划:
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+---------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+---------------------------------------+
| 1 | SIMPLE | t1 | NULL | ALL | NULL | NULL | NULL | NULL | 3457 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+---------------------------------------+
| 1 | SIMPLE | t2 | NULL | ALL | NULL | NULL | NULL | NULL | 4568 | 100.00 | Using join buffer (Block Nested Loop) |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+---------------------------------------+
这个执行计划,因为是一个多表关联查询。首先很明显,执行计划分为两条,也就是会访问两个表,先看如何访问第一个表,针对第一个表,明显是先用ALL方式全表扫描,扫出了3457条数据。<br /> 接着对第二个表的访问,也就是t2表,同样是全表扫描,因为多表关联方式,基本是笛卡尔积的效果,t1表的每条数据都会去t2表全表扫描扫描出 4568 条数据,跟t2表的每一条数据都会做一个关联,而且**extra里说是 Nested Loop**,也就是嵌套循环的方式,跟我们之前说的关联语句的执行原理都是匹配的。<br />另外两条执行计划的id都是1,是一样的,实际上一般来说一个select会对应一个id,因为这两条执行计划对应的是一个SELECT语句,所以他们俩的id都是1,是一样的。如果要是有一个子查询,有另外一个SELECT,那么另外一个SELECT子查询对应的执行计划的id就可能是2了。
全表扫描=====>extra 列信息 显示Using join buffer
(3)总结:
今天说了单表查询和多表关联的执行计划什么样子,接下来会说下子查询之类的执行计划,其实执行计划的本质,就是各种不同的SQL语句的执行计划是什么样的。