首页 > 数据库 >Mysql中的explain查看执行计划

Mysql中的explain查看执行计划

时间:2022-12-02 16:47:11浏览次数:29  
标签:查看 explain 查询 索引 Mysql Using where id select

Mysql中的explain查看执行计划
1、explain是什么?

  查看执行计划。

2、怎么使用?

  explain + sql语句。

3、执行计划包含的信息:

  id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra

4、各个字段的意思:

  (1)id: select查询的序列号,包含一组数字,表示查询中执行select字句或操作的顺序。

id有三种值:

  id相同,执行顺序由上至下。
  id不同,如果是子查询,id的序号会递增,id越大优先级越高,先被执行。
  id相同不同,如1,1,2,id相同可以认为是一组,从上往下顺序执行。在所有组中,id越大,优先级越高,越先被执行。
(2)select_type:查询的类型,主要是用于区别普通查询,联合查询,子查询等的复杂查询。

  Select_type的值有:simple, primary, subQuery, derived, union, union result.

  Simple:简单的select查询,查询中不包含子查询或者union;
  Primary:主查询,查询中若包含任何子查询,最外层查询则被标记为主查询;
  subQuery:子查询,在select或者where列表中包含子查询。
  Derived:临时表,在from列表中包含的子查询被标记为derived(衍生);
  Union:第二个select出现在union之后,则被标记为union;
  Union result:从union表中获取结构的select;
(3)table:显示这一行的数据是关于哪张表的;

(4)type:访问类型排列;

  显示查询使用了哪一种类型,从最好到最差依次是:
  System > const > eq_ref > ref > range > index > ALL

  一般来说,得保证查询到range级别,最好能到ref级别。

值解释:

  System:表中只有一行记录(等于系统表),这是const类型的特例,平时不会出现,这个可以忽略不计。

  Const:表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快。例如将主键置于where列表中,mysql将该查询转为一个常量。

  Eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。

  Ref:非唯一性索引扫描,返回匹配某个单独值得所有行。

  Range:只检索给定范围的行,使用一个索引来选择行。Key列显示使用了哪个索引,一般就是在你的where语句中出现了between, <, >, in等的查询。这种范围扫描比全表扫描,因为它只需要开始于索引的某一点,而结束于另一点,不用扫描全部索引。

  Index:full index scan全索引扫描,index与all的区别为:index类型只遍历索引树,这通常比all快,因为索引文件通常比数据文件小。也就是说虽然index和all都是读全表,但index是从索引中读的,而all是从硬盘中读的。

  All:全表扫描,是最慢的类型。

(5)possible_keys:显示可能应用在这张表中的索引,一个或者多个。

  查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。

(6)Key:实际使用的索引。

  如果为null,则没有使用索引。查询中若出现了覆盖索引,则该索引仅出现在key列表中。

(7)Key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。

  在不损失精确性的情况下,长度越短越好。

  Key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。

(8)Ref:显示索引的具体一列被使用了,也可能是一个const。

  哪些列或者常量被用于查找索引列上的值。

(9)Rows:根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。数值越低越好。

(10)Extra:不适合在其他列显示,但十分重要的额外信息。

Extra有如下几个值:

  Using filesort
  Using temporary
  Using index
  Using where
  using join buffer
  impossible where,
  Select tables optimized away
  distinct
值的解释:

  Using filesort:
  说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。Mysql中无法利用索引完成的排序操作称为“文件排序”。

  Using temporary:
  使用了临时表保存中间结果。常见于排序order by和分组查询group by。
  Using filesort和Using temporary都是不太好的结果,会影响性能。

  Using index:表示相应的select操作中使用了覆盖索引,避免访问了表的数据行,效率不错!
  如果同时出现了using where,表明索引被用来执行索引键值的查找;
  如果没有同时出现using where,表明索引用来读取数据而非执行查找动作。

  Using where:表示使用了where过滤。

  Using join buffer:使用了连接缓存。

  impossible where:表示where条件总是false。例如:where name=”zs” and name=”ls”;

  Select tables optimized away:没有group by子句下,基于索引优化Max/Min操作。

  Distinct:优化distinct,在找到第一匹配的元组后即停止找到同样值得动作。

  编写高质量的sql语句的几点建议
  1、尽量select具体字段;

  2、明确1条数据时,用limit 1;

  3、尽量少用or;

  4、优化limit分页,limit 10000 10很慢。例如:(1)order by + 索引;(2)业务中限制页数;

  5、优化like,%放后面,遵循最佳左前缀法则;

  6、where 条件尽量限制住,不要返回不符合业务的多余数据;

  7、索引字段尽量不要参与mysql内置函数 或者 其他表达式计算;

  8、表连接优先考虑内连接,如果是left join,应该小表驱动大表;

  9、尽量where条件少用 != ;

  10、组合索引时,注意索引列的顺序,遵循最左匹配原则;

  11、如果要插入的数据过多,尽量批量保存;

  12、慎用distinct关键字,当过多字段时,distinct多个字段sql将很慢;

  13、尽量不要用is null 或者 is not null,可以考虑用默认值;

  14、当in后面数据量过大时,应该考虑用exists关键字来实现;

  15、表连接时,尽量写别名,查询字段也用“别名.”的方式;

  16、尽量varchar代替char,除非字段全是固定个字符;

  17、字符串一定要用“”引起来;

  18、经常使用explain分析你的sql语句。

 


————————————————
版权声明:本文为CSDN博主「pipizhen_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/pipizhen_/article/details/115335294

标签:查看,explain,查询,索引,Mysql,Using,where,id,select
From: https://www.cnblogs.com/hanzeng1993/p/16944869.html

相关文章

  • 数据库面试题--Mysql
    MySQL1.什么是索引?2.索引是个什么样的数据结构呢?3.Hash索引和B+树索引有什么区别或者说优劣呢?4.在建立索引的时候,都有哪些需要考虑的因素呢?5.了解过哪些存储引......
  • 二进制部署MySQL8
    下载安装包:wgethttps://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz下载依赖:yum-yinstalllibaio解压安装:tar-x......
  • Python高级-mini-web框架、添加路由、MySQL功能-笔记
    此篇文章是接着上一篇文章写的​​《Python高级-WSGI、mini-web框架-笔记》​​下一篇​​《Python高级-mini-web框架、添加log日志、路由支持正则-笔记》​​1.miniweb框......
  • linux++mysql命令行操作
    linux操作:切换root>sudosu  linux mysql命令行操作root@fossx:/opt/fossx/conf#sudomysql-uroot-pmysql>showdatabase;mysql>usefossx;mysql>showtab......
  • Mysql的安装和卸载(删除注册表的残余文件)
    对于会忘记数据库的密码,或者改了数据库密码后无法登录,可以把数据库先卸载在安装,不过原来建的数据可能丢失,因此在平时练习等操作的时候要有备份的好习惯。我看网上有很多说......
  • mysql innodb中的两类索引
    mysql的innodb中有两类索引,分别是Cluster形式的主键索引(PrimaryKey),另外一种则是和其他存储引擎(如MyISAM存储引擎)存放形式基本相同的普通B-Tree......
  • mysql的show index和optimize
    今天复习了MYSQL中的showindex和optimize,在mysql中,观察索引的用法如下:mysql>SHOWINDEXFROMmytableFROMmydb;mysql>SHOWINDEXFROMmydb.m......
  • linux下查看硬盘读写速度
    在linux下,可以查看硬盘的读写速度,比如#hdparm-t/dev/hda查看硬盘读写速度最后可以看到timingbuffereddiskreads:.......开启DMA功能hdpa......
  • mysql中的benchamark函数
    今天偶然发现MYSQL这个函数,可以测试某些函数的运行效率,可以为函数指定循环测试次数和表达式,比如mysql>set@input:='helloworld';mysql>selec......
  • mysql 性能学习1
    1使用explain语句去查看分析结果,如explainselect*fromtest1whereid=1;会出现:idselecttypetabletypepossible_keyskeykey_lenrefro......