Mysql的sql语句执行效率检查 --Explain

  • 每一次每次面试都是对自己的一次考试和学习,这句话说的一点也不假,所以在面试的时候我们不必为没有得到offer而苦恼,而应该为了学习而感到庆幸。

  • 今天面试官问了我一句话,用一句什么sql 语句可以查看sql的语句执行效果?好呆我也是折腾了2年 mysql的人,居然被问蒙了,我完全没有听过。利用面试结束的时间好好的科普了一下。

Explain

  • Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。

Explain 语法:Explain Select * from about;

输出

    +----+-------------+-------+-------+-------------------+-----
    ----+---------+-------+------+-------+
    | id | select_type | table | type | possible_keys | key | 
    key_len | ref | rows | Extra |
    +----+-------------+-------+-------+-------------------+-----
    ----+---------+-------+------+-------+

##上面每个属性的意思,下面给大家讲解一下

  • id: Select 的查询序列号
  • select_type: 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: 这列是最重要的,显示了连接使用了那种类别,有无使用索引,是使用Explain命令分析性能瓶颈的关键项之一

      结果值从好到坏依次是:
    
       system > const > eq_ref > ref > fulltext > ref_or_null >  
       index_merge > unique_subquery > index_subquery > range > 
       index > ALL
    

一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。
+ possible_keys:列指出Mysql能使用那种索引在该表中找到行
+ key: 现设mysql实际决定使用的键(索引)。如果没有索引,键是null
+ key_len:现设mysql决定使用的键长度。如果键是NULL,则成都那么NULL。使用索引的长度。在不损失精确性的情况下,长度越短越好
+ ref:显示使用哪些列或常数与key一起从表中选择行
+ rows:显示Mysql认为它执行查询时必须检查的行数
+ Extra:包含Mysql解决查询的详细信息,也是关键参考项之一

 Distinct:一旦MYSQL找到了与行相联合匹配的行,就不再搜索了
 Not exists:优化了left join,一旦找到了匹配的left join标准的行,就不再搜索了
 Range checked for each

 Record(index map:#)没有找到理想的索引,因此对于从前面表中来的每一个行组合,Mysql检查使用哪个索引,并用它来表示从表中返回行。这是用索引的最慢连接之一。
 using index:列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部请求列都是同一个索引的部分的时候
 Using temporary:看到这个的时候,查询需要优化了。这里,Mysql需要创建一个临时表来储存结果,这通常发生在对不同的列集进行ORDER by 上,而不是 GROUP BY伤
 Using where:使用了WHERE 重句来限制哪些行将与下一张表匹配或者返回给用户。如果不想返回表中的全部行,并且连接类型ALL 或index,这就会发生,或是查询有问题。 + 其中一些TIP:

1.当type显示为‘index’时,并且Extra显示为“Using index”,表明使用了覆盖索引