mysql关键字explain,优化查询效率

(参考)https://blog.csdn.net/hll814/article/details/50765232
https://blog.csdn.net/lr131425/article/details/61918741

explain关键字

如果在select语句前放上关键词explain,mysql将解释它如何处理select,提供有关表如何联接和联接的次序。

explain属性:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
图示:
在这里插入图片描述

  • id:select查询的序列号
  • select_type:select查询的类型,主要是区别普通查询和联合查询、子查询之类的复杂查询
    SIMPLE:简单SELECT(不使用UNION或子查询等)
    PRIMARY:最外面的SELECT
    UNION:UNION中的第二个或后面的SELECT语句
    DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询
    UNION RESULT:UNION的结果。
    SUBQUERY:子查询中的第一个SELECT
    DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询
    DERIVED:导出表的SELECT(FROM子句的子查询)
  • table: 输出的行所引用的表
  • type:

联合查询所使用的类型,type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:

system > const > eq_ref > ref >fulltext > ref_or_null > index_merge > unique_subquery >index_subquery > range > index > ALL

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

     type=const表示通过索引一次就找到了;

     type=all,表示为全表扫描;

     type=ref,因为这时认为是多个匹配行,在联合查询中,一般为REF;
  • possible_keys:

指出MySQL能使用哪个索引在该表中找到行。如果是空的,没有相关的索引。这时要提高性能,可通过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引。

  • key:

显示MySQL实际决定使用的键。如果没有索引被选择,键是NULL。

     key=primary的话,表示使用了主键;

     key=null表示没用到索引。
  • key_len:

显示MySQL决定使用的键长度。如果键是NULL,长度就是NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好。文档提示特别注意这个值可以得出一个多重主键里mysql实际使用了哪一部分。

  • ref:

显示哪个字段或常数与key一起从表中选择行。

  • rows:

这个数表示mysql要遍历多少数据才能找到,在innodb上是不准确的。

  • Extra:

    如果是Only index,这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快。

    如果是where used,就是使用上了where限制。

    如果是impossible where 表示用不着where,一般就是没查出来啥。

    Distinct
    一旦MYSQL找到了与行相联合匹配的行,就不再搜索了

    Not exists
    MYSQL 优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了

    Range checked for each

    Record(index map:#)
    没有找到理想的索引,因此对于从前面表中来的每一 个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一

    Using filesort
    看 到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来 排序全部行

    Using index
    列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表 的全部的请求列都是同一个索引的部分的时候

    Using temporary
    看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上

    Using where
    使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index, 这就会发生,或者是查询有问题

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值