这篇文章将给大家介绍如何使用解释来分析一条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的性能的标准总结