2021数据库考试题及答案 mysql题目和详细答案( 七 )


22.聊聊select 语句执行计划!我们都知道用explain xxx分析sql语句的性能,但是具体从explain的结果怎么分析性能以及每个字段的含义你清楚吗?这里我做下总结记录,也是供自己以后参考 。
首先需要注意:MYSQL 5.6.3以前只能EXPLAIN SELECT; MYSQL5.6.3以后就可以EXPLAIN SELECT,UPDATE,DELETE
explain结果示例:
mysql> explain select * from staff;+----+-------------+-------+------+---------------+------+---------+------+------+-------+| id | select_type | table | type | possible_keys | key| key_len | ref| rows | Extra |+----+-------------+-------+------+---------------+------+---------+------+------+-------+|1 | SIMPLE| staff | ALL| NULL| NULL | NULL| NULL |2 | NULL|+----+-------------+-------+------+---------------+------+---------+------+------+-------+1 row in set先上一个官方文档表格的中文版:
Column含义id查询序号select_type查询类型table表名partitions匹配的分区typejoin类型prossible_keys可能会选择的索引key实际选择的索引key_len索引的长度ref与索引作比较的列rows要检索的行数(估算值)filtered查询条件过滤的行数的百分比Extra额外信息这是explain结果的各个字段,分别解释下含义:
1. idSQL查询中的序列号 。
id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行 。
2. select_type查询的类型,可以是下表的任何一种类型:
select_type类型说明SIMPLE简单SELECT(不使用UNION或子查询)PRIMARY最外层的SELECTUNIONUNION中第二个或之后的SELECT语句DEPENDENT UNIONUNION中第二个或之后的SELECT语句取决于外面的查询UNION RESULTUNION的结果SUBQUERY子查询中的第一个SELECTDEPENDENT SUBQUERY子查询中的第一个SELECT, 取决于外面的查询DERIVED衍生表(FROM子句中的子查询)MATERIALIZED物化子查询UNCACHEABLE SUBQUERY结果集无法缓存的子查询,必须重新评估外部查询的每一行UNCACHEABLE UNIONUNION中第二个或之后的SELECT,属于无法缓存的子查询DEPENDENT 意味着使用了关联子查询 。
3. table查询的表名 。不一定是实际存在的表名 。可以为如下的值:
<unionM,N>: 引用id为M和N UNION后的结果 。<derivedN>: 引用id为N的结果派生出的表 。派生表可以是一个结果集,例如派生自FROM中子查询的结果 。<subqueryN>: 引用id为N的子查询结果物化得到的表 。即生成一个临时表保存子查询的结果 。4. type(重要)这是最重要的字段之一,显示查询使用了何种类型 。从最好到最差的连接类型依次为:
system,const,eq_ref,ref,fulltext,ref_or_null,index_merge,unique_subquery,index_subquery,range,index,ALL
除了all之外,其他的type都可以使用到索引,除了index_merge之外,其他的type只可以用到一个索引 。
1、system表中只有一行数据或者是空表,这是const类型的一个特例 。且只能用于myisam和memory表 。如果是Innodb引擎表,type列在这个情况通常都是all或者index
2、const最多只有一行记录匹配 。当联合主键或唯一索引的所有字段跟常量值比较时,join类型为const 。其他数据库也叫做唯一索引扫描
3、eq_ref多表join时,对于来自前面表的每一行,在当前表中只能找到一行 。这可能是除了system和const之外最好的类型 。当主键或唯一非NULL索引的所有字段都被用作join联接时会使用此类型 。
eq_ref可用于使用’=’操作符作比较的索引列 。比较的值可以是常量,也可以是使用在此表之前读取的表的列的表达式 。
相对于下面的ref区别就是它使用的唯一索引,即主键或唯一索引,而ref使用的是非唯一索引或者普通索引 。eq_ref只能找到一行,而ref能找到多行 。
4、ref对于来自前面表的每一行,在此表的索引中可以匹配到多行 。若联接只用到索引的最左前缀或索引不是主键或唯一索引时,使用ref类型(也就是说,此联接能够匹配多行记录) 。


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: