zoukankan      html  css  js  c++  java
  • MySql]explain用法及实践

    explain对我们优化sql语句是非常有帮助的。可以通过explain+sql语句的方式分析当前sql语句。

    例子

    EXPLAIN SELECT dt,method,url FROM app_log WHERE id=11789

    table

    显示这一行数据属于哪张表,若在查询中为select起了别名,则显示别名。

    EXPLAIN SELECT dt,method,url FROM app_log AS temp WHERE id=11789

    type

    在表里查到结果所用的方式。包括(性能有差——>高): All | index | range | ref | eq_ref | const,system | null |

    all:全表扫描,MySQL 从头到尾扫描整张表查找行。

    EXPLAIN SELECT dt,method,url FROM app_log AS temp LIMIT 100

    注意:这里虽然使用limit但并不能改变全表扫描。

    index:按索引扫描表,虽然还是全表扫描,但优点是索引是有序的。

    EXPLAIN SELECT id FROM app_log AS temp LIMIT 100

    range:以范围的方式扫描索引。比较运算符,以及in的type都是range。

    EXPLAIN SELECT * FROM app_log AS temp WHERE id>100 LIMIT 199

    ref:非唯一性索引访问

    EXPLAIN SELECT * FROM app_log AS temp  WHERE dt='2015-01-02' LIMIT 199

    eq_ref:使用唯一性索引查找(主键或唯一索引)

    EXPLAIN SELECT * FROM app_log JOIN app_details_log USING(id)

    先全表扫描了app_details_log表,然后在对app_log进行eq_ref查找。因为app_log的id字段是主键。如果此时删除app_log的id为主键,则都会进行全表扫描。

    const:常量,在整个查询过程中这个表最多只会有一条匹配的行,比如主键 id=1 就肯定只有一行,只需读取一次表数据便能取得所需的结果,且表数据在分解执行计划时读取。

    EXPLAIN SELECT * FROM app_log WHERE id=11790

    注意:system 是 const 类型的特例,当表只有一行时就会出现 system 。

    null:在优化的过程已经得到结果,不再需要访问表或索引。例如表中并不存在id=1000的记录。

    EXPLAIN SELECT * FROM app_log WHERE id=1000

    possible_keys

    可能被用到的索引。

    EXPLAIN SELECT * FROM app_log  WHERE id>100 LIMIT 100 ;

    Key

    查询过程中实际用到的索引,例子如上图,实际用的索引列为主键列。

    key_len

    索引字段最大可能使用的长度。例如上图中,Key_len:4,因为主键是int类型,长度为4.

    ref

    指出对key列所选择的索引的查找方式,常见的有const,func,null,具体字段名。当key列为null,即不使用索引时,此值也为null.

    rows

    mysql估计需要扫描的行数,只是一个估算。

    Extra

    这个显示其他的一些信息,但对优化sql也非常的重要。

    using Index:此查询使用了覆盖索引(Convering Index),即通过索引就能返回结果,无需访问表。弱没显示“Using Index”表示读取了表数据。

    EXPLAIN SELECT id FROM app_log;

    因为 id 为主键索引,索引中直接包含了 id 的值,所以无需访问表,直接查找索引就能返回结果。

    using where:mysql从存储引擎收到行后再进行“后过滤(Post-filter)”。后过滤:先读取整行数据,再检查慈航是否符合where的条件,符合就留下,不符合便丢弃。检测是在读取行后进行的,所以叫后过滤。

    EXPLAIN SELECT id FROM app_log WHERE id>100 LIMIT 100;

    using temporary:使用到临时表,在使用临时表的时候,Extra为这个值。

    using filesort:若查询所需的排序与使用的索引的排序一直,因为索引已排序,因此按索引的顺序读取结果返回,否则,在取到结果后,还需要按查询所需的顺序对结果进行排序,这时就会出现using filesort。

    EXPLAIN SELECT id FROM app_log WHERE id>100 GROUP BY dt;

  • 相关阅读:
    TCP/IP四层模型
    Java中equals和==的区别
    最全前端资源汇集
    (转)php面向对象学习笔记
    学习内容
    Gulp入门教程
    seajs的CMD模式的优势以及使用
    正则
    Grunt
    Javascript 异步加载详解
  • 原文地址:https://www.cnblogs.com/moxiaotao/p/9714325.html
Copyright © 2011-2022 走看看