工欲善其事必先利其器!

作为一名程序员,免不了要和MYSQL打交道。而在这过程中,就不得不面对性能优化这一大课题。

而在性能优化中,EXPLAIN就是能够帮助我们查看SQL执行计划是否优化的一个工具。

今天,我们就基于一个案例来看看EXPLAIN的神奇作用。

一、具体案例

我们来执行一条非常简单的代码:

expain select * from t1,t2,t3 where t1.id=t2.id and t2.id=t2.id;

执行之后的结果如下:

发现出来了很多的字段,这么多字段其实也没必要每个都重点关注,上面图片用红色框框标出了5个字段,这些是需要重点关注的。下面具体来说说这5个字段的含义。

1.type

表示访问表的方式,一共有6种。

从最好到最差的结果依次如下:

system > const > eq_ref > ref > range > index > ALL

注意:一个好的SQL语句至少要达到range级别!杜绝出现all级别。

system: 表示结果集仅有一行;

const: 表示通过主键或者唯一键查找数据时只匹配最多一行数据;

eq_ref: 该类型多出现在多表join场景,通过主键或者唯一键访问表;

对于前表b的每行记录,都只能匹配到后表a的一行记录并且查询的比较操作通常是=,查询效率较高。

ref: 此类型通常出现在sql使用非唯一或非主键索引, 或者是使用最左前缀规则索引的查询;

range: 表示where条件使用索引范围查询,当 type 是 range 时,ref 字段为 NULL。

index: 表示全索引扫描, 扫描所有的索引记录, 而不扫描数据;

index 类型通常会出现在覆盖索引中,所要查询的数据直接在索引中就可以访问, 而不用回表扫描数据。 此时Extra 字段 会显示 Using index。还有一种是全表扫描时通过索引顺序访问数据。此时并不会在Extra提示 using index。

ALL: 表示执行计划选择全表扫描,当执行计划出现type 为all 时,我们尽量通过修改索引的方式让查询利用索引。

2.key

此字段是 MySQL 在当前查询时所使用到的索引。

如果没有选择索引,值是NULL。

可以采取强制索引方式。

3.key_len

key_len表示执行计划所选择的索引长度有多少字节,通常我们可借此判断联合索引有多少列。

key_len 大小的计算规则是:

一般地,key_len 等于索引列类型字节长度,例如int类型为4 bytes,bigint为8 bytes;如果是字符串类型,还需要同时考虑字符集因素,例如:CHAR(30) UTF8则key_len至少是90 bytes;若该列类型定义时允许NULL,其key_len还需要再加 1 bytes;若该列类型为变长类型,例如 VARCHAR(TEXT\BLOB不允许整列创建索引,如果创建部分索引也被视为动态列类型),其key_len还需要再加 2 bytes。

4.rows

表示的是扫描行数。

记住:该值是个预估值,所以并非是完全准确的值。

MySQL 查询优化器根据统计信息,估算 SQL 要查找到结果集需要扫描读取的数据行数。

原则上 rows 越少越好。

5.extra

该列会提示优化执行计划的额外的信息。

注意,常见的不太友好的、值得大家关注的有如下几种:

Using index。表示该sql利用覆盖索引扫描,也即从只访问索引即可获取到所需的数据,而不用回表。

Using where。表示该sql 回表获取数据了。什么是回表呢? 其实就是仅仅通过访问索引不能满足获取所需的数据,需要访问表的page 页。

如果和Using index 同时出现,说明where条件通过索引定位数据,然后回表,再过滤所需要的数据。

Using filesort。说明排序没有利用索引而发生了额外排序 ,伴随着的可能还有Using temporary。

其实还有其他一些 提示Using MRR、Using index condition 、Using index for group-by,这些提示是正向的,说明sql比较优化。

6.其它字段

前面讲了5个比较重要的字段,相信很多求知欲强的小伙伴也想知道其它字段是什么意思,这里也一并列出来,以供参考:

字段

含义

查询语句的序号或者说是标识符

select_type

表是查询的类型,常见的有如下6种

table

其值为表名或者表的别名,表示访问哪一个表

partitions

匹配的分区

possible_keys

表示查询时,可能使用的索引

filtered

按表条件过滤的行百分比

二、总结

本文基于一个最为简单的案例讲解了explain的执行结果,最为重要的是5个字段,其它字段了解含义即可,希望对您有用~

mysql 多key索引_MYSQL的EXPLAIN到底多好用?相关推荐

  1. mysql explain 索引_MySql中Explain详解与索引最佳实践

    使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是 如何处理你的SQL语句的.分析你的查询语句或是结构的性能瓶颈 下面是使用 explain 的例子: 在 select 语句之 ...

  2. mysql字段简索引_Mysql索引优化攻略(全)

    所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如二叉树的算法和哈希算法,哈希算法是通过建立特征值,然后根据特征值来快速查找.而用的最多,并且是mysql默认的就是二叉树算法 BTREE, ...

  3. mysql字段简索引_MySQL优化看这一篇就够了

    本文概要 概述 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 ...

  4. mysql or 创建索引_Mysql索引优化

    1.单表索引优化 单表索引优化分析 创建表 建表 SQL CREATE TABLE IF NOT EXISTS article( id INT(10) UNSIGNED NOT NULL PRIMAR ...

  5. mysql添加临时索引_mysql 中添加索引的三种方法

    在mysql中有多种索引,有普通索引,全文索引,唯一索引,多列索引,小伙伴们可以通过不同的应用场景来进行索引的新建,在此列出三种新建索引的方法 mysql 中添加索引的三种方法 1.1 新建表中添加索 ...

  6. mysql物理删除索引_mysql创建索引,mysql索引优化,mysql索引创建删除

    mysql创建索引,mysql索引优化,mysql索引创建删除 ================================ ©Copyright 蕃薯耀 2020-11-23 http://fa ...

  7. mysql 派生表 索引_MySQL 索引初探

    MYSQL索引 什么是索引 为什么要建立索引 索引的优缺点和使用原则 索引的分类 单列索引:一个索引只包含单个列,但一个表中可以有多个单列索引. 普通索引:MySQL中基本索引类型,没有什么限制,允许 ...

  8. mysql locate不走索引_MySQL 索引——定位并优化慢 SQL

    定位并优化慢查询SQL.png 为什么要学习定位并优化慢查询 SQL 日常开发中,在数据量比较小的表中,SQL 的执行效率可能没什么问题,但是随着表数据量的增加,慢 SQL 可能就会慢慢浮现,因此学习 ...

  9. mysql多列索引_MySQL的多列索引

    什么是索引? 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里面 ...

最新文章

  1. windows7安dns服务器_在Windows 7 上安装DNS服务器bind9方法详解
  2. 读书笔记 effective c++ Item 50 了解何时替换new和delete 是有意义的
  3. mxnet dmlc-core\src\io\local_filesys.cc: Check failed: allow_null
  4. 样例问题 Example question for A4M33MPV course
  5. 神策数据:围绕跨境电商“人货场”,数据如何助力品牌乘风出海?
  6. rpm安装的mysql如何数据迁移_linux下mysql数据库的rpm安装步骤及常见问题的解决
  7. 【Linux网络编程】并发服务器之select模型
  8. 测试流程图_配方分析 测试说明及流程图详解
  9. python字符串无效的原因_Python(60)扩展和嵌入1.使用 C 或 C++ 扩展 Python
  10. Linux:VMware Tools安装方法及共享文件夹设置方法
  11. Bean在Spring和SpringMVC中无所不在
  12. 25. Magento 创建新闻模块(5)
  13. 一图看尽史上三次浏览器大战
  14. 省-市-区三级联动选择地址 + 地图定位(高德api定位获取位置信息),互相联动显示
  15. 【ACWing】671. DDD
  16. 银行营销策略数据分析 - 智能定位
  17. 交换机思科远程连接配置
  18. ps -aux ps -ef 命令
  19. foxmail邮件加载失败重试_foxmail 提示错误
  20. Java中级面试题及答案解析(4)

热门文章

  1. Win64 驱动内核编程-9.系统调用、WOW64与兼容模式
  2. 【Android 逆向】函数拦截 ( CPU 高速缓存机制 | CPU 高速缓存机制 导致 函数拦截失败 )
  3. 【Java 并发编程】指令重排序规范 ( happens-before 先行发生原则 )
  4. 【Java 注解】自定义注解 ( 元注解 )
  5. 【Android RTMP】Android Camera 视频数据采集预览 ( 视频采集相关概念 | 摄像头预览参数设置 | 摄像头预览数据回调接口 )
  6. 02.v-cli快速搭建
  7. 图解反向代理和正向代理。
  8. 101PPT游戏化换肤遇到的问题
  9. 手把手带你使用JS-SDK自定义微信分享效果
  10. 获取一个对象的属性/属性值,以及动态给属性赋值