分析一条sql的性能的标准总结

  

这篇文章将给大家介绍如何使用解释来分析一条sql。

  

网上其实已经有非常多的文章都很详细的介绍了解释的使用,这篇文章将实例和原理结合起来,尽量让你有更好的理解,相信我,认真看完你应该会有特别的收获。

  

解释翻译过来就是解释的意思,在mysql里被称作执行计划,即可以通过该命令看出mysql在经过优化器分析后决定要如何执行该条sql。

  

说到优化器,再多说一句,mysql内置了一个强大的优化器,优化器的主要任务就是把你写的sql再给优化一下,尽可能以更低成本去执行,比如扫描更少的行数,避免排序等。执行一条sql语句都经历了什么?我在前面的文章中有介绍过优化器相关的。

  

你可能会问,一般在什么时候会要用解释呢,大多数情况下都是从mysql的慢查询日志中揪出来一些查询效率比较慢的sql来使用解释分析,也有的是就是在对mysql进行优化的时候,比如添加索引,通过解释来分析添加的索引能否被命中,还有的就是在业务开发的时候,在满足需求的情况下,你可能需要通过解释来选择一个更高效的sql。

  

那么解释该怎么用呢,很简单,直接在sql前面加上解释就行了,如下所示。

        mysql>解释select *从t;      + - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - + +      | | id select_type表| | |型possible_keys关键| | key_len | ref额外| | |行      + - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - + +      | 1 |简单t所有零零| | | | |空零零| | 100332 | |      + - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - + +      1行集(0.04秒)      

可以看到,解释会返回约10个字段,不同版本返回的字段有些许差异,每个字段都代表着具体的意义,这篇文章我不打算把每个字段都详细的介绍一遍,东西比较多,怕你也不容易记住,不如先把几个重要的字段好好理解了。

  

其中类型、关键行,额外的这几个字段我认为是比较重要的,我们接下来通过具体的实例来帮你更好的理解这几个字段的含义。

  

首先有必要简单介绍下这几个字段的字面意思。

  

类型表示mysql访问数据的方式,常见的有全表扫描(所有),遍历索引(指数),区间查询(范围),常量或等值查询(ref, eq_ref),主键等值查询(常量),当表中只有一条记录时(系统)。下面是效率从最好到最差的一个排序。

        系统比;const祝辞eq_ref祝辞ref祝辞范围比;指数比;之前      

键表示查询过程实际会用到的索引名称。

  

行表示查询过程中可能需要扫描的行数,这个数据不一定准确,是mysql抽样统计的一个数据。

  

额外的表示一些额外的信息,通常会显示是否使用了索引,是否需要排的序,是否会用到临时表等。

  

好了,接下来正式开始实例分析。

  

还是沿用前面文章中创建的存储引擎创建一个测试表,我们这里插入10 w条测试数据,表结构如下:

        创建表“t”(      “id”int(11)不是零,      ' a ' int(11)默认为空,      ' b ' int(11)默认为空,      主键(“id”)      )引擎=InnoDB;      

然后看下面这条查询语句,注意这个表目前只有一个主键索引,还没有创建普通索引。

        mysql>改变表t添加索引a_index(一个);      查询好,0行影响(0.19秒)      记录:0副本:0警告:0            mysql>改变表t添加索引b_index (b);      查询好,0行影响(0.20秒)      记录:0副本:0警告:0            mysql>显示指数从t;      + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +      表| | Non_unique | Key_name | Seq_in_index | Column_name |基数排序| | Sub_part | |空包装| Index_type |评论| Index_comment |      + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +      主要t | 0 | | | 1 | | id零零| | | 100332 | | BTREE | | |      t | 1 | | a_index | 1 | | 100332 | |空零来|是| | | | |      b t | 1 | | b_index | 1 | | 100332 | |空零来|是| | | | |      + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +      3行集(0.00秒)

分析一条sql的性能的标准总结