MySQL——通过EXPLAIN分析SQL的执行计划

在MySQL中,我们可以通过EXPLAIN命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序。

下面分别对EXPLAIN命令结果的每一列进行说明:

  • select_type:表示SELECT的类型,常见的取值有:

    类型说明
    SIMPLE简单表,不使用表连接或子查询
    PRIMARY主查询,即外层的查询
    UNIONUNION中的第二个或者后面的查询语句
    SUBQUERY子查询中的第一个
  • table:输出结果集的表(表别名)

  • type:表示MySQL在表中找到所需行的方式,或者叫访问类型。常见访问类型如下,从上到下,性能由差到最好:

    ALL全表扫描
    index索引全扫描
    range索引范围扫描
    ref非唯一索引扫描
    eq_ref唯一索引扫描
    const,system单表最多有一个匹配行
    NULL不用扫描表或索引
    1. type=ALL,全表扫描,MySQL遍历全表来找到匹配行

      一般是没有where条件或者where条件没有使用索引的查询语句

      EXPLAIN SELECT * FROM customer WHERE active=0;

    2. type=index,索引全扫描,MySQL遍历整个索引来查询匹配行,并不会扫描表

      一般是查询的字段都有索引的查询语句

      EXPLAIN SELECT store_id FROM customer;

    3. type=range,索引范围扫描,常用于<、<=、>、>=、between等操作

      EXPLAIN SELECT * FROM customer WHERE customer_id>=10 AND customer_id<=20;

      注意这种情况下比较的字段是需要加索引的,如果没有索引,则MySQL会进行全表扫描,如下面这种情况,create_date字段没有加索引:

      EXPLAIN SELECT * FROM customer WHERE create_date>='2006-02-13' ;

    4. type=ref,使用非唯一索引或唯一索引的前缀扫描,返回匹配某个单独值的记录行

      store_id字段存在普通索引(非唯一索引)

      EXPLAIN SELECT * FROM customer WHERE store_id=10;

      ref类型还经常会出现在join操作中:

      customerpayment表关联查询,关联字段customer.customer_id(主键),payment.customer_id(非唯一索引)。表关联查询时必定会有一张表进行全表扫描,此表一定是几张表中记录行数最少的表,然后再通过非唯一索引寻找其他关联表中的匹配行,以此达到表关联时扫描行数最少。

      因为customerpayment两表中customer表的记录行数最少,所以customer表进行全表扫描,payment表通过非唯一索引寻找匹配行。

      EXPLAIN SELECT * FROM customer customer INNER JOIN payment payment ON customer.customer_id = payment.customer_id;

    5. type=eq_ref,类似ref,区别在于使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配

      eq_ref一般出现在多表连接时使用primary key或者unique index作为关联条件。

      film、film_text表关联查询和上一条所说的基本一致,只不过关联条件由非唯一索引变成了主键。

      EXPLAIN SELECT * FROM film film INNER JOIN film_text film_text ON film.film_id = film_text.film_id;

    6. type=const/system,单表中最多有一条匹配行,查询起来非常迅速,所以这个匹配行的其他列的值可以被优化器在当前查询中当作常量来处理

      const/system出现在根据主键primary key或者 唯一索引 unique index 进行的查询

      根据主键primary key进行的查询:

      EXPLAIN SELECT * FROM customer WHERE customer_id =10;

      根据唯一索引unique index进行的查询:

      EXPLAIN SELECT * FROM customer WHERE email ='MARY.SMITH@sakilacustomer.org';

    7. type=NULL,MySQL不用访问表或者索引,直接就能够得到结果

  • possible_keys: 表示查询可能使用的索引

  • key: 实际使用的索引

  • key_len: 使用索引字段的长度

  • ref: 使用哪个列或常数与key一起从表中选择行。

  • rows: 扫描行的数量

  • filtered: 存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例(百分比)

  • Extra: 执行情况的说明和描述,包含不适合在其他列中显示但是对执行计划非常重要的额外信息

    最主要的有一下三种:

    Using Index表示索引覆盖,不会回表查询
    Using Where表示进行了回表查询
    Using Index Condition表示进行了ICP优化
    Using Flesort表示MySQL需额外排序操作, 不能通过索引顺序达到排序效果

什么是ICP?

MySQL5.6引入了**Index Condition Pushdown(ICP)**的特性,进一步优化了查询。Pushdown表示操作下放,某些情况下的条件过滤操作下放到存储引擎。

EXPLAIN SELECT * FROM rental WHERE rental_date='2005-05-25' AND customer_id>=300 AND customer_id<=400;

在5.6版本之前:

优化器首先使用复合索引idx_rental_date过滤出符合条件rental_date='2005-05-25'的记录,然后根据复合索引idx_rental_date回表获取记录,最终根据条件customer_id>=300 AND customer_id<=400过滤出最后的查询结果(在服务层完成)。

在5.6版本之后:

MySQL使用了ICP来进一步优化查询,在检索的时候,把条件customer_id>=300 AND customer_id<=400也推到存储引擎层完成过滤,这样能够降低不必要的IO访问。Extra为Using index condition就表示使用了ICP优化。

参考

《深入浅出MySQL》


                                                       -----END-----


     喜欢本文的朋友们,欢迎扫一扫下图关注公众号撸码那些事,收看更多精彩内容

                                        


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python将argv作为参数_在jupyter / ipython notebook中将命令行参数传递给argv

经过大量的环顾后,我发现了非常繁琐的自定义库,但是用几行代码解决了它,我认为这些代码很漂亮.我使用nbconvert最终得到一个html报告作为输出,包含笔记本中的所有图形和降价,但是通过最小的python包装器接受命令行参数&#xff1a;python文件test_args.py(正常执行命令行参数)&…

模拟输入(ADC-A0)

ESP8266具有内置的10位ADC&#xff0c;只有一个ADC通道(A0引脚)&#xff0c;即只有一个ADC输入引脚可读取来自外部器件的模拟电压 ESP8266上的ADC通道和芯片供电电压复用&#xff0c;也就是说我们可以将其设置为测量系统电压或者外部电压 测量外部电压&#xff1a; analogRead(…

SQL Server 连接超时案例一则

原文:SQL Server 连接超时案例一则上周六&#xff0c;一工厂系统管理员反馈一数据库连接不上&#xff0c;SSMS连接数据库报“连接超时时间已到。在尝试使用预登录握手确认时超过了此超时时间.......”, 如下截图所示&#xff1a; 另外远程连接也连接不上&#xff0c;系统管理员…

mysql 删除5天前 备份_mysql自动备份删除5天前的备份

1、查看磁盘空间情况&#xff1a;df -h2、创建备份目录&#xff1a;上面我们使用命令看出/home下空间比较充足&#xff0c;所以可以考虑在/home保存备份文件&#xff1b;cd /homemkdir backupcd backup3、创建备份Shell脚本:注意把以下命令中的DatabaseName换为实际的数据库名称…

个人作业-Alpha项目测试

这个作业属于哪个课程https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2作业地址https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2/homework/3340团队名称脑阔疼https://www.cnblogs.com/chaserFF/p/10994338.html这个作业的目标完成班级项目互评…

深入理解brew link命令

来源&#xff1a;https://newsn.net/say/brew-link-php71.html brew是mac机上面程序猿非常常用的软件包安装方式&#xff0c;其中有两组命令是需要大家知晓的。分别是&#xff1a;第一组&#xff1a;brew install和brew uninstall。第二组&#xff0c;brew link和brew unlink。…

scss2css vscode设置_VSCode下让CSS文件完美支持SCSS或SASS语法方法

VSCode下让CSS文件完美支持SCSS或SASS语法方法习惯Webpack PostCSS后, 通常PostCSS都是直接对CSS文件进行处理, 但是大部分习惯SCSS/SASS/LESS的朋友也许不适应了. 我专门研究了一下, 在Visual Studio Code编辑器下如果配置相关代码和设置达到CSS文件完美编写SCSS的办法, 其他…

第5章 初识JQuery

JQuery是对JavaScript的封装&#xff0c;简化了JS代码&#xff0c;是主流框架的基础(VUE,EasyUI,Bootstrap) 它是2006年推出的JQuery的优势&#xff1a; 体积小&#xff0c;压缩后只有100KB左右 强大的选择器 出色的DOM封装 可靠的事件处理机制 出色的浏览器兼容性 使用隐式迭代…

Jenkins的Pipeline脚本在美团餐饮SaaS中的实践

2019独角兽企业重金招聘Python工程师标准>>> 一、背景 在日常开发中&#xff0c;我们经常会有发布需求&#xff0c;而且还会遇到各种环境&#xff0c;比如&#xff1a;线上环境&#xff08;Online&#xff09;&#xff0c;模拟环境&#xff08;Staging&#xff09;&…

6.12交流

czy bzoj5424烧桥计划 f[i][j]暴力&#xff0c;可以分两段转移&#xff0c;更近的一段单调队列 发现&#xff0c;最多分成sqrt(n)段。 因为如果只有一段&#xff0c;ansn*2000 而如果多段&#xff0c;至少是∑i*1000&#xff0c;那么&#xff0c;i的上界是sqrt(n)级别的。 所以…

java椭圆_如何用java画椭圆

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼利用java画出椭圆。也就是鼠标一边移动一边显示出椭圆&#xff0c;如何做到请大神指教这是我写的(没有达到我自己的要求)&#xff1a;import java.awt.*;import java.awt.Graphics;import java.awt.event.*;import javax.swing.*;i…

【springboot+easypoi】一行代码搞定excel导入导出

原文&#xff1a;https://www.jianshu.com/p/5d67fb720ece 开发中经常会遇到excel的处理&#xff0c;导入导出解析等等&#xff0c;java中比较流行的用poi&#xff0c;但是每次都要写大段工具类来搞定这事儿&#xff0c;此处推荐一个别人造好的轮子【easypoi】&#xff0c;下面…

用java编写一个计算器_用java程序编写一个计算器

展开全部给你一个参考&#xff0c;希望不62616964757a686964616fe58685e5aeb931333330343261要被百度吞了当晚餐import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.text.DecimalFor…

TypeScript基础入门 - 接口 - 可索引的类型

转载地址 TypeScript基础入门 - 接口 - 可索引的类型 项目实践仓库 https://github.com/durban89/typescript_demo.git tag: 1.0.11 为了保证后面的学习演示需要安装下ts-node&#xff0c;这样后面的每个操作都能直接运行看到输出的结果。 npm install -D ts-node 后面自己在练…

jquery中的ajax方法(备忘)

参考&#xff1a;https://www.cnblogs.com/tylerdonet/p/3520862.html w3school:http://www.w3school.com.cn/jquery/ajax_ajax.asp 1.url: 要求为String类型的参数&#xff0c;&#xff08;默认为当前页地址&#xff09;发送请求的地址。 2.type: 要求为String类型的参数&…

java高级类_Java高级类特性(一)

权限类内同包不同包子类不同包非子类private√default√√protected√√√public√√√√四、super关键字的使用package com.test.java;/** super可以用来修饰属性、方法、构造器* 1)当子类与父类中有同名的属性时&#xff0c;可以通过"super.属性"显式的调用父类中声…

Android.对话框(AlertDialog/Toast/Snackbar)

1、资料&#xff1a; 1.1、Android提醒微技巧&#xff0c;你真的了解Dialog、Toast和Snackbar吗&#xff1f; - CSDN博客.html&#xff08;https://blog.csdn.net/guolin_blog/article/details/51336415&#xff09; 1.2、Android界面设计之对话框——定制Toast、AlertDialog -…

第4次作业

转载于:https://www.cnblogs.com/wzh2920330283/p/11027254.html

基于Docker搭建Percona XtraDB Cluster数据库集群

本文实验的环境参数 阿里云ECS Centos7.5Docker version 18.06.0-cepercona/percona-xtradb-cluster:5.7Percona XtraDB Cluster的镜像下载地址&#xff1a;https://hub.docker.com/r/percona/percona-xtradb-cluster/ 怎么使用Docke和下载镜像&#xff0c;请查看Docker的官方文…

java publickey_数字证书中读取PublicKey

1. 读取https签发证书中的key1) 在下面的代码中,是实现读取证书字符串来读取key的,CERTIFICATE 就是一个证书的字符串, 而方法cf.generateCertificate() 接受的是一个InputStream 流,当然这个地方也可以读取一个文件 new FileInputSream("file path")即可!public Str…