湖北网站科技建设,咸阳做网站托管,网站首页代码怎么做,留言网站建设今天我们就一步一步的来讲解不同的SQL语句的执行计划长什么样子#xff0c;先来看第一条SQL语句#xff0c;特别的简单#xff0c;就是#xff1a; explain select * from t1 就这么一个简单的SQL语句#xff0c;那么假设他这个里面有大概几千条数据#xff0c;此时执行计…今天我们就一步一步的来讲解不同的SQL语句的执行计划长什么样子先来看第一条SQL语句特别的简单就是 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 | ±—±------------±------±-----------±-----±--------------±-----±--------±-----±-----±---------±------
一起来分析一下上面的执行计划吧学习当然得从最简单的地方开始一步一步得来相信每个人都能成为分析SQL执行计划的高手。
首先呢id是1这个不用管他了select_type是SIMPLE这个先不说他什么意思你要知道顾名思义这个表的查询类型是很普通的、而且简单的就可以了。
table是t1这还用说么表名就是t1所以意思就是这里要访问t1这个表。type是all这就是我们之前提到的多种访问方式之一了all就是全表扫描这没办法你完全没加任何where条件那当然只能是全表扫描了
而且如果大家记得我们之前讲解的底层访问方式就会知道这里直接会扫描表的聚簇索引的叶子节点按顺序扫描过去拿到表里全部数据。
rows是3457这说明全表扫描会扫描这个表的3457条数据说明这个表里就有3457条数据此时你全表扫描会全部扫描出来。filtered是100%这个也很简单了你没有任何where过滤条件所以直接筛选出来的数据就是表里数据的100%占比。
怎么样有没有觉得稍微对执行计划有点感觉了似乎也没那么难是吧因为有了之前内容的大量铺垫和积累大家对SQL语句的底层执行原理本身已经有了一定的理解了所以看执行计划就会很简单的。
接着再来看一个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) | ±—±------------±------±-----------±-----±--------------±-----±--------±-----±-----±---------±--------------------------------------
这个执行计划就比较有意思了因为是一个多表关联的执行计划。首先很明显他的执行计划分为了两条也就是会访问两个表先看他如何访问第一个表的针对第一个表就是t1明显是先用ALL方式全表扫描他了而且扫出了3457条数据。
接着对第二个表的访问也就是t2表同样是全表扫描因为他这种多表关联方式基本上是笛卡尔积的效果t1表的每条数据都会去t2表全表扫描所有4568条数据跟t2表的每一条数据都会做一个关联而且extra里说了是Nested Loop也就是嵌套循环的访问方式跟我们之前讲解的关联语句的执行原理都是匹配的。
另外大家会发现上面两条执行计划的id都是1是一样的实际上一般来说在执行计划里一个SELECT会对应一个id因为这两条执行计划对应的是一个SELECT语句所以他们俩的id都是1是一样。
如果你要是有一个子查询有另外一个SELECT那么另外一个SELECT子查询对应的执行计划的id就可能是2了。
好那么今天我们讲解了一下单表查询和多表关联的执行计划长什么样子接下来我们会讲解子查询之类的语句的执行计划其实讲解执行计划的本质就是用各种不同的SQL语句来给大家讲解他们的执行计划什么样子大家看多了自然就知道了。