MySQL explain获取查询指令信息原理及实例

explain用于获取查询执行计划信息,

一、语法

只需要在select前加上explain即可,如:

mysql> explain select 1;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra     |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
| 1 | SIMPLE   | NULL | NULL    | NULL | NULL     | NULL | NULL  | NULL | NULL |   NULL | No tables used |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+

二、explain中的信息

1、id:表示SELECT所属的行。id越大,则执行顺序越高,id相同时,从上到下执行。

2、select_type:显示对应行是简单还是复杂查询

1)SIMPLE:简单查询,意味着不包含子查询和UNION

2)SUBQUERY:表示是个子查询

3)DERIVED:用来表示包含在FORM子句的子查询中的SELECT

4)UNION:

3、table:表示访问哪个表

4、partitions:访问分区

5、type:关联类型,就是如何查找表中的行。

1)ALL:全表扫描。为了查找数据必须从头带尾的扫描所有的数据(limit关键字不会扫描所有数据)

2)index:索引扫描。这个跟全表扫描一样,只是扫描表时按索引次序而不是行,主要优点是避免了排序,最大缺点是承担按索引次序读取整个表的开销。

3)range:范围扫描。就是一个有限制的索引扫描,它开始于索引的某一点,不用遍历全部索引。

4)ref:索引访问。它返回所有匹配某个单值的行。只有使用非唯一性所有或者唯一性所有的非唯一性前缀时才会发生。

5)eq_ref:使用这个索引查找,最多返回一条记录,如果主键索引和唯一性索引。

6)const,system:当MySQL能对查询的某一部分进行优化并将其转换成一个常量时,就会使用这些访问类型

6、possible_keys:显示查询可以用哪些所有

7、key:MySQL决定采用哪个索引来优化这个该表的访问,如果这个索引没有出现在possible_keys中,它可能选择了一个覆盖索引,如果没有使用索引,这个值为NULL

8 、key_len:索引的字节数,越短越好。一般来说key_len等于索引列字段类型长度,如int是4字节,bigint是8字节,date是3个字节,datetime是8个字节;如果索引列是字符串类型,则需要考虑他的字符集,utf8每个字符占3个字段,可变类型(varchar)额外需要2个字节;如果索引列可为空,则额外需要1个字段。

9、ref:

10、rows:MySQL估计为了找到所需的行而要读取的行

11、filtered:返回结果的行数占读取行数的百分比(估算),值越大越好

12、Extra:显示不适合其他列但也重要的信息,常见得值有:

1)Using index:表示使用覆盖索引,以避免访问表

2)Using where:MySQL服务器将在存储引擎检索行后再进行过滤

3)Using temporary:表示MySQL对查询结果排序时会使用一个临时表。

三、示例

示例1:

mysql> explain select * from bd_dept;
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table  | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE   | bd_dept | NULL    | ALL | NULL     | NULL | NULL  | NULL |  3 |  100.00 | NULL |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+

可以看出该语句进行了全表扫描,没有用到索引

示例2:

mysql> explain select * from bd_dept where id=1;
+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table  | partitions | type | possible_keys | key   | key_len | ref  | rows | filtered | Extra |
+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| 1 | SIMPLE   | bd_dept | NULL    | const | PRIMARY    | PRIMARY | 4    | const |  1 |  100.00 | NULL |
+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+

该语句用到了主键索引,只需扫描一条记录就可以得到结果,int类型占4个字节,所以ken_len=4。

示例3:

mysql> explain select * from bd_dept where dept_code='01';
+----+-------------+---------+------------+-------+---------------+-----------+---------+-------+------+----------+-------+
| id | select_type | table  | partitions | type | possible_keys | key    | key_len | ref  | rows | filtered | Extra |
+----+-------------+---------+------------+-------+---------------+-----------+---------+-------+------+----------+-------+
| 1 | SIMPLE   | bd_dept | NULL    | const | dept_code   | dept_code | 32   | const |  1 |  100.00 | NULL |
+----+-------------+---------+------------+-------+---------------+-----------+---------+-------+------+----------+-------+

dept_code是一个唯一性索引字段,字段类型为varchar(10),不为空,所以索引长度为10*3+2=33。

示例4:

mysql> explain select * from bd_dept where create_date>'2020-04-29';
+----+-------------+---------+------------+-------+---------------+-------------+---------+------+------+----------+-----------------------+
| id | select_type | table  | partitions | type | possible_keys | key     | key_len | ref | rows | filtered | Extra         |
+----+-------------+---------+------------+-------+---------------+-------------+---------+------+------+----------+-----------------------+
| 1 | SIMPLE   | bd_dept | NULL    | range | create_date  | create_date | 4    | NULL |  1 |  100.00 | Using index condition |
+----+-------------+---------+------------+-------+---------------+-------------+---------+------+------+----------+-----------------------+

create_date是date类型,普通索引字段,可为空,查询条件为大于,所以关联类型为range,索引长度为3+1=4。

示例5:

mysql> explain select a.id, a.dept_name, b.dept_name parent_name from bd_dept a inner join bd_dept b on a.id=b.parent_id;
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key   | key_len | ref         | rows | filtered | Extra    |
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------------+------+----------+-------------+
| 1 | SIMPLE   | b   | NULL    | ALL  | NULL     | NULL  | NULL  | NULL         |  3 |  100.00 | Using where |
| 1 | SIMPLE   | a   | NULL    | eq_ref | PRIMARY    | PRIMARY | 4    | zhi_test.b.parent_id |  1 |  100.00 | NULL    |
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------------+------+----------+-------------+

可以看出MySQL先执行一个全表扫描,再通过主键进行关联

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • MySQL中通过EXPLAIN如何分析SQL的执行计划详解

    前言 在MySQL中,我们可以通过EXPLAIN命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序. 下面分别对EXPLAIN命令结果的每一列进行说明: .select_type:表示SELECT的类型,常见的取值有: 类型 说明 SIMPLE 简单表,不使用表连接或子查询 PRIMARY 主查询,即外层的查询 UNION UNION中的第二个或者后面的查询语句 SUBQUERY 子查询中的第一个 .table:输出结果集的表(表别名) .t

  • MySql中如何使用 explain 查询 SQL 的执行计划

    explain命令是查看查询优化器如何决定执行查询的主要方法. 这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,值得花时间去了解,因为可以学习到查询是如何执行的. 1.什么是MySQL执行计划 要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有简单的了解. MySQL本身的功能架构分为三个部分,分别是 应用层.逻辑层.物理层,不只是MySQL ,其他大多数数据库产品都是按这种架构来进行划分的. 应用层,主要负责与客户端进行交互,建立链接,记住链接状态,

  • MySQL查询优化之explain的深入解析

    在分析查询性能时,考虑EXPLAIN关键字同样很管用.EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作.以及MySQL成功返回结果集需要执行的行数.explain 可以帮助我们分析 select 语句,让我们知道查询效率低下的原因,从而改进我们查询,让查询优化器能够更好的工作. 一.MySQL 查询优化器是如何工作的MySQL 查询优化器有几个目标,但是其中最主要的目标是尽可能地使用索引,并且使用最严格的索引来消除尽可能多的数据行.最终目标是提交 SEL

  • MySQL性能优化神器Explain的基本使用分析

    简介 MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性优化. EXPLAIN 命令用法十分简单, 在 SELECT 语句前加上 Explain 就可以了, 例如: EXPLAIN SELECT * from user_info WHERE id < 300; 准备 为了接下来方便演示 EXPLAIN 的使用, 首先我们需要建立两个测试用的表, 并添加相应的数据: CREATE TABLE `user

  • mysql总结之explain

    explain主要用于sql语句中的select查询,可以显示的查看该sql语句索引的命中情况,从而更好的利用索引.优化查询效率. Explain语法如下:explain [extended] select ... 其中extended是选用的,如果使用的extended,那么explain之后就可以使用show warnings查看相应的优化信息,也就是mysql内部实际执行的query. 列名 描述 说明 相关链接 id 若没有子查询和联合查询,id则都是1. Mysql会按照id从大到小的

  • MySQL查询语句过程和EXPLAIN语句基本概念及其优化

    网站或服务的性能关键点很大程度在于数据库的设计(假设你选择了合适的语言开发框架)以及如何查询数据上. 我们知道MySQL的性能优化方法,一般有建立索引.规避复杂联合查询.设置冗余字段.建立中间表.查询缓存等,也知道用EXPLAIN来查看执行计划. 但对MySQL复杂查询语句执行过程和内部机制,MySQL Optimizer本身所做优化以及查询语句调整对性能所产生的影响及其原因知之甚少. 本文试图对其中的一些关键概念如执行过程.索引使用等做比较深入的探讨,知其然,知其所以然, 这样可以避免在原本通

  • Mysql中explain作用详解

    一.MYSQL的索引 索引(Index):帮助Mysql高效获取数据的一种数据结构.用于提高查找效率,可以比作字典.可以简单理解为排好序的快速查找的数据结构. 索引的作用:便于查询和排序(所以添加索引会影响where 语句与 order by 排序语句). 在数据之外,数据库还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用数据.这样就可以在这些数据结构上实现高级查找算法.这些数据结构就是索引. 索引本身也很大,不可能全部存储在内存中,所以索引往往以索引文件的形式存储在磁盘上. 我们

  • mysql中explain用法详解

    如果在select语句前放上关键词explain,mysql将解释它如何处理select,提供有关表如何联接和联接的次序. explain的每个输出行提供一个表的相关信息,并且每个行包括下面的列: 1,id   select识别符.这是select的查询序列号.2,select_type 可以为一下任何一种类型simple  简单select(不使用union或子查询)primary   最外面的selectunion    union中的第二个或后面的select语句dependent uni

  • MySQL explain获取查询指令信息原理及实例

    explain用于获取查询执行计划信息, 一.语法 只需要在select前加上explain即可,如: mysql> explain select 1; +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+ | id | select_type | table | partitions | type |

  • PHP+MySQL实现模糊查询员工信息功能示例

    本文实例讲述了PHP+MySQL实现模糊查询员工信息功能.分享给大家供大家参考,具体如下: 一.代码 注意两点: 1.用Notepad+编辑时,格式选择:[编码字符集]->[中文]->[gb2312] 2. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> conn.php <?php $connID=mysql_connect("lo

  • 微信小程序授权获取用户详细信息openid的实例详解

    小程序获取用户的头像昵称openid之类 第一种使用wx.getUserInfo直接获取微信头像,昵称 wx.getUserInfo({ success: function (res) { that.setData({ nickName: res.userInfo.nickName, avatarUrl: res.userInfo.avatarUrl, }) }, }) 第二种 我们在使用小程序wx.login API进行登录的时候,直接使用wx.getUserInfo是不能获取更多的信息的,如

  • Python3获取拉勾网招聘信息的方法实例

    前言 为了了解跟python数据分析有关行业的信息,大概地了解一下对这个行业的要求以及薪资状况,我决定从网上获取信息并进行分析.既然想要分析就必须要有数据,于是我选择了拉勾,冒着危险深入内部,从他们那里得到了信息.不得不说,拉勾的反爬技术还挺厉害的,稍后再说明.话不多说,直接开始. 一.明确目的 每次爬虫都要有明确的目的,刚接触随便找东西试水的除外.我想要知道的是python数据分析的要求以及薪资状况,因此,薪资.学历.工作经验以及一些任职要求就是我的目的. 既然明确了目的,我们就要看一下它们在

  • 使用HttpServletResponse对象获取请求行信息

    目录 HttpServletResponse对象获取请求行信息 方法列表 实例 HttpServletResponse和HttpServletRequest解析 HttpServletResponse和HttpServletRequest HttpServletResponse HttpServletResponse对象获取请求行信息 方法列表 String reqMethod = request.getMethod() String reqURI=request.getRequestURI()

  • mysql explain的用法(使用explain优化查询语句)

    首先我来给一个简单的例子,然后再来解释explain列的信息. 表一:catefory 文章分类表: CREATE TABLE IF NOT EXISTS `category` ( `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=MyISAM INSERT INTO `test`.`category` VAL

  • PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能

    本文实例讲述了PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能.分享给大家供大家参考,具体如下: 一.代码 td{ font-size:9pt; } .style2 {color: #FFFFFF} <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html>

  • MySQL JOIN关联查询的原理及优化

    目录 1 关联查询的执行 2 没有索引的算法 1 关联查询的执行 关联查询的执行过程是:先遍历关联表t1(驱动表,全表扫描),然后根据从表t1中取出的每行数据中的a值,去表t2(被关联表,被驱动表)中查找满足条件的记录,可以走t2的索引搜索.在形式上,这个过程就跟我们写程序时的嵌套查询类似,并且可以用上被驱动表的索引,所以我们称之为“Index Nested-Loop Join”,简称NLJ.在join语句的执行流程中,驱动表是走全表扫描,而被驱动表是走索引树搜索. 假设被驱动表的行数是M.每次

  • 微信获取用户地理位置信息的原理与步骤

    在微信公众服务号开发需求中经常有获取用户位置信息的功能,通过用户的位置信息,可以做一些地图导航,以及基于LBS的营销活动. 下面通过给大家介绍微信服务号获取用户位置信息的原理与步骤. 原理 1. 位置信息获取流程 2. 位置信息报文 <xml><ToUserName><![CDATA[gh_public_member_account]]></ToUserName> <FromUserName><![CDATA[oNEGGwGfl8f5xME

  • mysql开启慢查询(EXPLAIN SQL语句使用介绍)

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能. 1.开启慢查询 1> 查看慢查询是否开启 show variables like "%quer%"; slow_query_log = ON #已开启 2> 开启方法:my.cnf目录配置 slow_query_

随机推荐