您的位置: 翼速应用 > 业内知识 > 数据库 > 正文

关于mysql中执行计划的详细解析来了

本文是关于mysql的相关知识教程解析,和大家详细聊聊mysql中的执行计划。在mysql中,执行计划是数据库提供给用户的一套对sql语句进行解析、分析、优化功能的工具。执行计划的作用有:

1、展示表的读取顺序;

2、数据读取操作的类型;

3、展示哪些索引是可以使用的

4、展示哪些索引是实际上使用的;

5、展示表之间的引用关系;

6、展示每张表被查询的行数。


关于mysql中执行计划的详细解析来了


本文适用于:windows7系统、mysql8版本、Dell G3电脑。


关于mysql中执行计划的详细解析来了


在数据库查询的时候,我们通常会使用sql语句去查询自己所需要的数据。但是,关于sql在数据库中是如何执行的,它有没有使用索引,具体使用了哪些索引,查找了哪些字段和表,他们的顺序是怎样的,分别用时多少等等信息我们不得而知,那么有没有什么方法可以看到这些信息,mysql给我们提供了一套工具——执行计划。


MySQL执行计划


执行计划是数据库提供给我们的一套对sql语句进行解析、分析、优化功能的工具,他具有以下的作用:


●  展示表的读取顺序;


●  数据读取操作的类型;


●  哪些索引是可以使用的;


●  哪些索引是实际上使用的;


●  表之间的引用关系;


●  每张表被查询的行数。


注意:执行计划只是数据库针对sql给出最佳的优化参考方案,并不一定是最优解,即不要过度相信执行计划。要使用执行计划很简单,在要执行的sql前面加上关键词explain即可。


详细解析


sql执行计划主要包含以下信息:id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、Extra。


id


select查询序列号,id相同,执行顺序由上至下;id不同,id值越大优先级越高,越先被执行;


select_type


select_type:表示select语句的类型,可以有以下取值;


●  SIMPLE:表示简单查询,其中不包含连接查询和⼦查询;


●  PRIMARY: 表示主查询,或者是最外⾯的查询语句;


●  UNION:表示连接查询的第2个或后⾯的查询语句;


●  DEPENDENT UNION:UNION中的第⼆个或后⾯的SELECT语句,取决于外⾯的查询;


●  UNION RESULT: 连接查询的结果;


●  SUBQUERY:⼦查询中的第1个SELECT语句;


●  DEPENDENT SUBQUERY:⼦查询中的第1个SELECT语句,取决于外⾯的查询;


●  DERIVED:SELECT(FROM ⼦句的⼦查询)。


table


table:表示查询的表名,可以有以下几种情况:


●  显示表名,如果起了别名,则显示别名;


●  <derivenN>:表示查询的条件是一个子查询;


●  <union1,2>:表示表1和表2使用union。


partitions


partitions:匹配的分区。


type


type:这⼀列表示表关联类型或访问类型,即数据库决定如何查找表中的⾏,查找数据⾏记录的⼤概范围。依次从最优到最差分别为:system > const > eq_ref > ref > range > index > all


●  system:表中只有一行记录,相当于系统表,这是const类型的特列,平时不会出现,可以忽略不计;


●  const:通过索引一次命中,匹配一行数据,所以很快,常⽤于PRIMARY KEY或者UNIQUE索引的查询,可理解为const是最优化的;


●  eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常用语主键或唯一索引扫描,这可能是在 const 之外最好的联接类型了;


●  ref:非唯一性索引扫描,返回匹配某个单独值的所有行,用于=、<或>操作符带索引的列;


●  range:只检索给定范围的行,使用一个索引来选择行,一般用于between、<、>、in等查询,这种范围查询要比index要好,因为他只需要扫描索引的一个点,结束于另外一个点;


●  index:需要遍历索引树;


●  all:即全表扫描,意味着数据库需要从头到尾去查找所需要的⾏。通常情况下这需要增加索引来进⾏优化了。


注意:在进行sql优化的时候至少要优化到range,推荐优化到ref,最好是const。


possible_keys


possible_keys:这⼀列显示查询可能使⽤哪些索引来查找。explain 时可能出现 possible_keys 有列,⽽ key 显示 NULL 的情况,这种情况是因为表中数据不多,数据库认为索引对此查询帮助不⼤,选择了全表查询。


如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查 where ⼦句看是否可以创造⼀个适当的索引来提⾼查询性能,然后⽤ explain 查看效果。


key


key:显示数据库实际决定使⽤的键(索引)。如果没有选择索引,key的值是NULL。可以强制使⽤索引或者忽略索引。


key_len


key_len:这⼀列显示了数据库在索引⾥使⽤的字节数,通过这个值可以算出具体使⽤了索引中的哪些列,数值计算如下:


●  字符串类型


  ○  char(n):n字节长度

  ○  varchar(n):2字节存储字符串长度,如果是utf-8,则长度 3n + 2


●  数值类型


  ○  tinyint:1字节

  ○  smallint:2字节

  ○  int:4字节

  ○  bigint:8字节  


●  时间类型 


  ○  date:3字节

  ○  timestamp:4字节

  ○  datetime:8字节


如果字段允许为 NULL,需要1字节记录是否为 NULL


注意:索引最⼤⻓度是768字节,当字符串过⻓时,数据库会做⼀个类似左前缀索引的处理,将前半部分的字符提取出来做索引。


ref


ref:这⼀列显示了在key列记录的索引中表查找值所⽤到的列或常量,常见的有:const(常量),func,null,字段名(例:film.id)


rows


rows:这⼀列是数据库估计要读取并扫描的⾏数,注意这个不是结果集⾥的⾏数,因此这个值越小越好。


filtered


filtered:返回结果的行数占读取行数的百分比,值越大越好。


Extra


extra:这一列显示的是额外的信息,即不包含在其他列的信息,具体值如下:


●  distinct:数据库发现第1个匹配⾏后,停⽌为当前的⾏组合搜索更多的⾏;


●  not exists:数据库能够对查询进⾏LEFT JOIN优化,发现1个匹配LEFT JOIN标准的⾏后,不再为前⾯的的⾏组合在该表内检查更多的⾏;


●  range checked for each record (index map: #):数据库没有发现好的可以使⽤的索引,但发现如果来⾃前⾯的表的列值已知,可能部分索引可以使⽤;


●  using filesort(重点):数据库会对结果使⽤⼀个外部索引排序,⽽不是按索引次序从表⾥读取⾏。此时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和⾏指针,然后排序关键字并按顺序检索⾏信息。这种情况下⼀般也是要考虑使⽤索引来优化的;


●  using index(重点):从只使⽤索引树中的信息⽽不需要进⼀步搜索读取实际的⾏来检索表中的列信息,即表示select使用了覆盖索引而不必去回表查询;


●  using temporary(重点):数据库需要创建⼀张临时表来处理查询,这种情况常见于order by和group by。出现这种情况⼀般是要进⾏优化的,⾸先是想到⽤索引来优化;


●  using where:数据库将在存储引擎检索⾏后再进⾏过滤。就是先读取整⾏数据,再按where 条件进⾏检查,符合就留下,不符合就丢弃;


●  using index condition:与Using where类似,查询的列不完全被索引覆盖,where条件中是⼀个前导列的范围;


●  using sort_union(...), Using union(...), Using intersect(...):这些函数说明如何为index_merge联接类型合并索引扫描;


●  using index for group-by:类似于访问表的Using index⽅式,Using index for group-by表示数据库发现了⼀个索引,可以⽤来查 询group by或distinct查询的所有列,⽽不要额外搜索硬盘访问实际的表;


●  null:查询的列未被索引覆盖,并且where筛选条件是索引的前导列,意味着⽤到了索引,但是部分字段未被索引覆盖,必须通过“回表”来实现,不是纯粹地⽤到了索引,也不是完全没⽤到索引,即使用了索引但需要回表操作,应该避免回表操作。


关于mysql中执行计划的详细解析就到这里,翼速应用平台内有更多相关资讯,欢迎查阅!,


我来说两句

0 条评论

推荐阅读

  • 响应式布局CSS媒体查询设备像素比介绍

    构建响应式网站布局最常见的是流体网格,灵活调整大小的站点布局技术,确保用户在使用的幕上获得完整的体验。响应式设计如何展示富媒体图像,可以通过以下几种方法。

    admin
  • 提升网站的性能快速加载的实用技巧

    网站速度很重要,快速加载的网站会带来更好的用户体验、更高的转化率、更多的参与度,而且在搜索引擎排名中也扮演重要角色,做SEO,网站硬件是起跑线,如果输在了起跑线,又怎么跟同行竞争。有许多方法可提升网站的性能,有一些技巧可以避免踩坑。

    admin
  • 织梦CMS TAG页找不到标签和实现彩色标签解决方法

    织梦cms是我们常见的网站程序系统的一款,在TAG标签中常常遇到的问题也很多。当我们点击 tags.php 页的某个标签的时候,有时会提示:“系统无此标签,可 能已经移除!” 但是我们检查程序后台,以及前台显示页面。这个标签确实存在,如果解决这个问题那?

    admin
  • HTML关于fieldset标签主要的作用

    在前端开发html页面中常用的标签很多,今天为大家带来的是关于HTML中fieldset标签主要的作用说明,根据技术分析HTML

    admin

精选专题