mysql sql优化(二)

mysql explain查询字段及字段包含的值

参考自:https://blog.csdn.net/eroswang/article/details/4541173

                https://blog.csdn.net/zhuxineli/article/details/14455029

一、概图如下



二、各个字段详细分析

1、id
          语句的执行顺序标识,如果在语句中没有子查询或联合,说明只有一个SELECT,于是这个列显示为1,否则内层的SELECT会顺序编号.

2、select_type
           显示了对应的查询是简单还是复杂SELECT,主要有以下几种查询类型

           1)  simple 简单类型
                语句中没有子查询或union

                

           2)  primary
                最外层的select ,【不是主键的意思】

              

            3)  union
                 union是在select 语句中第二个select语句后面所有的select,第一个select 为primary

            

            4) dependent subquery
                子查询中内层中第一个select语句

           

            5) dependent union
                 子查询中union且为union中第二个select开始的后面所有select,依赖于外部的结果集。

       

            6) SUBQUERY
                子查询内层查询的第一个SELECT,结果不依赖于外部查询结果集。

      

            7) devived
                 派生表的查询语句

      

            8) uncacheable subquery
                 结果集无法缓存的子查询
            9) union result
                 union中合并的结果

3、table
         1)、显示对应行正在访问哪个表
         2)、当FROM子句中有子查询或UNION时,table列是<derivedN>,其中N是id列对应的值

4、type
       这列很重要,显示了连接使用了哪种类别,有无使用索引。主要包括以下几种类型
       1)、all
              全表扫描,效果是最不理想的(未使用到索引)。

             
       2)、const
              const是在where条件以常量作为查询条件,最多只会有一条记录匹配,由于是常量,实际上只须要读一次。const用于用常数值比较PRIMARY KEY或UNIQUE索引的所有部分时。

           

      3)、eq_ref
             最多只会有一条匹配结果,一般是通过主键或唯一键索引来访问。一般会出现在连接查询的语句中。它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY KEY。
        

      4)、fulltext
             进行全文索引检索。
      5)、index
             该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。

例子:

      

分析:

     去掉order by ,type = all即全表扫描,

     存在order by,因为索引文件是根据id排序后的二叉树,所以先查找索引文件,再查找真实的数据


      6)、index_merge
             查询中同时使用两个(或更多)索引,然后对索引结果进行合并(merge),再读取表数据。
      7)、index_subquery
             子查询中的返回结果字段组合是一个索引(或索引组合),但不是一个主键或唯一索引。
      8)、range
              索引范围扫描。一个有限制的索引扫描,它开始于索引里的某一点,返回匹配这个值域的行(显而易见的范围扫描.即带有BETWEEN或在WHERE子句中带有>的查询,当MySQL使用索引去查找一系列值的时候,如IN()和OR列表,也为显示的范围扫描) 

          

      9)、ref
              也叫索引查找,他返回所有匹配某单个值的行,它可能会找到多个符合条件行。键不是UNIQUE或PRIMARY KEY(换句话说,如果联接不能基于关键字选择单个行的话),则使用ref。

       
     10)、ref_or_null
              该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。在解决子查询中经常使用该联接类型的优化。

       
      11)、system
              系统表,表中只有一行数据;

      
      12)、unique_subquery
             子查询中的返回结果字段组合是主键或唯一约束。

5、possible_keys

      表示查询时,可以使用的索引列,这是基于查询访问的列和使用的比较操作符来判断的。
6、key

      key列显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

7、key_len

      key_len列显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。
使用的索引的长度。在不损失精确性的情况下,长度越短越好 

8、ref

      ref列显示使用哪个列或常数与key一起从表中选择行。
9、rows

      rows列显示MySQL认为它执行查询时必须检查的行数。
10、Extra

        包含的是不适合在其他列显示的额外信息。常见的最重要的值如下:
       1)、Using index  此值表示mysql将使用覆盖索引,以避免访问表。不要把覆盖索引和index访问类型弄混了。
       2)、Using where  这意味着mysql服务器将在存储引擎检索行后再进行过滤,许多where条件里涉及索引中的列,当(并且如果)它读取索引时,就能被存储引擎检验,因此不是所有带where子句的查询都会显示“Using where”。有时“Using where”的出现就是一个暗示:查询可受益于不同的索引。
       3)、Using temporary 这意味着mysql在对查询结果排序时会使用一个临时表。看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上 
       4)、Using filesort 这意味着mysql会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。mysql有两种文件排序算法,这两种排序方式都可以在内存或者磁盘上完成,explain不会告诉你mysql将使用哪一种文件排序,也不会告诉你排序会在内存里还是磁盘上完成。看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行 

 


type中ref 和eq_ref区别

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值