当前位置: 首页 > 科技观察

说说explain查看执行计划

时间:2023-03-20 16:32:28 科技观察

explain是调优MySQL性能时必须要用到的关键词。它的作用是查看SQL语句的执行信息,包括表的读取顺序,应用的索引等信息。用法:解释+sql语句。在本文中,我们首先熟悉一下explain的内容,为下一篇学习索引打下基础。解释内容查看用户全表查询的执行计划:mysql>explainselect*fromuser;idid表示select查询语句的执行顺序或操作表的执行顺序。id的取值有两种情况:id相同表示执行顺序是从上到下;id不同,id的序号会递增,id的值越大,优先级越高,越早执行。select_typeselect_type表示查询类型,取值范围为:SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNION、UNIONRESULT。SIMPLE:简单查询,不包含子查询和UNION。PRIMARY:如果查询语句包含复杂的子查询,那么最外层的查询被标记为PRIMARY。SUBQUERY:select或where中的子查询。DERIVED:from列表中的子查询生成的派生表查询。UNION:联合查询。UNIONRESULT:从UNION表中获取结果的查询。从中获取表数据行的表。type表示查询中使用的是哪种类型,取值范围:ALL、index、range、ref、eq_ref、const、system。这是我们在优化的时候重点关注的一个指标。从最好到最差排序:system>const>eq_ref>ref>range>index>ALL。阿里SQL优化规范:【推荐】SQL性能优化目标:至少达到range级别,要求是ref级别,能const最好。注意:1)const单表最多只有一个匹配行(主键或唯一索引),优化阶段可以读取数据。2)ref指的是使用普通索引(normalindex)。3)range对索引进行范围检索。system:表中只有一行的查询,类似于系统表。eq_ref:对多个表进行唯一索引扫描,对于每个索引,只匹配表中的一行记录。index:索引物理文件全扫描,速度相对较慢,优于全表扫描性能。ALL:全表扫描。possible_keys可能会应用到这张表的索引上,可能有一个或多个,不一定是实际查询使用的索引。key查询中实际使用的索引,如果为null则表示没有使用索引。如果是覆盖索引,则只在key中显示。key_len表示索引字段的最大可能长度,不是实际长度,是根据表定义得到的,不是通过查表得到的。长度越短越好。ref表示使用索引的哪一列,可以是常量。哪些列或常量用于查找索引列上的值。Rows根据表信息和索引使用情况粗略估计需要扫描多少行才能找到需要的记录。越小越好。额外的扩展信息。阿里SQL优化规范:【推荐】使用覆盖索引进行查询操作,避免返表。解释:如果一本书需要知道第11章的标题是什么,它会打开第11章对应的页面吗?只需浏览目录即可。此目录用作覆盖索引。正例:可以建立的索引类型分为三种:主键索引、唯一索引、普通索引。覆盖索引只是一个查询的结果。在解释的结果中,会出现额外的列:usingindex。这里说的是覆盖索引,extra列中会出现using索引。Extra还有其他重要信息:usingfilesort:使用外部索引排序,即MySQL不能使用索引来完成排序。usingtemptory:使用临时表。usingwhere:使用过滤的地方。还有一些不常出现的类型,这里就不做说明了。