explain详解

知识点有可能在pdf里面不全,所以这两个都要看

综上图所述

执行顺序是:id从大到小,若相等就从上往下,id列为null的就表是这是一个结果集,不需要使用它来进行查询。

select_type字段中:

        primary:最外层select

        derived:临时表(from后边的临时表)

        subquery:select后边的临时表

table字段中:代表 表名(包含临时表)

        <derived3>:临时表(代表select_type字段中的derived  3是select_type字段中的derived前面的id)

type字段中:

这一列表表示关联类型和访问类型,即mysql决定如何查找效率中的行,查找数据记录的大概范围。

依次从最优到最差分别为:system>const>eq_ref>range>index>all

一般来说,得保证查询达到range级别,最好达到ref

NULL:mysql能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引,例如:在索引列中选取最小值,可以单独查找索引完成,不需要在执行时访问表

 

         const:代表常量,相当于这个sql查询速度和查常量(select 1 from dual)一样

        system:代表常量一种,表里只有一条数据匹配

        eq_ref:代表表中的主键或者唯一键和其他表进行关联 如上图

        ref:代表表中的辅助索引与其他表就行关联

        index:扫描全表索引,通常扫描二级索引(优化军规里面没有)

        index关键点:若查出来的数据在主键索引和辅助索引都有,会优先选择辅助索引,因为辅助索引占得空间小的多(子叶节点存放key),而主键索引占得空间大(子叶节点存放所有数据)

这种sql 虽然提示用了索引,但是还是特别慢需要优化,因为在辅助索引子叶节点遍历所有key(这种会涉及很多io,一个页到下一页就会io)

        all:也是用聚簇索引(主键索引)在叶子节点从头往后遍历,非常慢(多次io)

比index慢的原因是叶子节点存放数据,所以io次数更多

show warning 可以查询sql优化阶段情况

extra:额外信息(重要  )

        using where:代表索引失效,进行回表操作

        using index:代表不进行回表操作(称覆盖索引

         using filesort:代表的是 where和orderby连起来是否跨列使用,跨列会出现using filesort,若不跨列就不会出现  (order by是不用索引的) 

                             简单一点总结:运用临时空间进行了排序

        例如上sql1:连起来代表 a1,a2,a3(orderby不适用索引),所以最终用联合索引中的a1a2

        例如上sql2:连起来代表 a1,a3(orderby不适用索引)并且夸列了,所以最终用联合索引中的a1,并且extra会出现using filesort

Using index:使用了覆盖索引(不需要回表)

using index condition:使用了索引下推

possible_keys列有值,key没值这种情况:

因为idx_age可以使用,但是mysql认为不使用索引效果更快 

两表索引调优

谨记:小表驱动大表

 以上两个循环,最终都会循环3000次,但是对于双层循环来说,一般建议,将数据小的循环方外层,数据大的循环放内层,这样效率最快

1、先考虑sql连接方式

若sql是左连接,给左表关联字段添加索引

若sql是右连接,给右表关联字段添加索引

2、考虑where条件,然后对应的单表添加索引

三表优化索引:

1、小表驱动大表

2、索引建立在经常查询的字段上

在MySQL中,EXPLAIN是一个关键字,用于查询SQL语句的执行计划和索引使用情况。使用EXPLAIN可以帮助我们了解MySQL如何处理我们的查询语句,并对查询进行优化。 EXPLAIN命令会返回一个包含12列信息的结果集。这些列包括:id,select_type,table,partitions,type,possible_keys,key,key_len,ref,rows,filtered,Extra。每一列都提供了有关查询执行的详细信息。 - id列表示查询的标识符,常用来区分查询的不同部分。 - select_type列表示查询的类型,例如简单查询、子查询、联合查询等。 - table列表示与查询相关的表名。 - partitions列表示查询涉及的分区信息。 - type列表示查询的访问类型,包括全表扫描、索引扫描、范围扫描等。 - possible_keys列表示可能用到的索引。 - key列表示实际使用的索引。 - key_len列表示索引的长度。 - ref列表示查询中使用的索引引用。 - rows列表示查询返回的行数估计值。 - filtered列表示查询结果的过滤率。 - Extra列提供了额外的信息,如是否使用了临时表、是否使用了文件排序等。 通过分析EXPLAIN的结果,我们可以判断查询是否使用了索引,是否存在全表扫描等问题,从而进行查询性能的优化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Mysqlexplain详解](https://blog.youkuaiyun.com/weixin_44143114/article/details/118526637)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [MySQL数据库:第十七章:Explain详解](https://blog.youkuaiyun.com/java_wxid/article/details/111881486)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值