iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL执行计划中的各个参数及含义是什么
  • 189
分享到

MySQL执行计划中的各个参数及含义是什么

2024-04-02 19:04:59 189人浏览 八月长安
摘要

本篇文章给大家分享的是有关Mysql执行计划中的各个参数及含义是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧

本篇文章给大家分享的是有关Mysql执行计划中的各个参数及含义是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

 TABLE

显示这一行的数据是关于哪张表的。

EXPLaiN 
SELECT *
FROM   EMPLOYEE   E
      ,DEPARTMENT D
      ,CUSTOMER   C
WHERE  E.DEP_ID = D.ID
       AND E.CUS_ID = C.ID;
+----+-------------+-------+------------+--------+---------------+---------+---------+---------------+------+----------+----------------------------------------------------+
| id | select_type | table | partitions | type   | possible_keys | key     | key_len | ref           | rows | filtered | Extra                                              |
+----+-------------+-------+------------+--------+---------------+---------+---------+---------------+------+----------+----------------------------------------------------+
|  1 | SIMPLE      | C     | NULL       | ALL    | PRIMARY       | NULL    | NULL    | NULL          |    1 |   100.00 | NULL                                               |
|  1 | SIMPLE      | E     | NULL       | ALL    | NULL          | NULL    | NULL    | NULL          |    8 |    12.50 | Using where; Using join buffer (Block Nested Loop) |
|  1 | SIMPLE      | D     | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | demo.E.dep_id |    1 |   100.00 | NULL                                               |
+----+-------------+-------+------------+--------+---------------+---------+---------+---------------+------+----------+----------------------------------------------------+
3 rows in set, 1 warning (0.04 sec)

Id完全相同,都是1,并且select_type的类型为simple,所以是对单表进行扫描,第一步执行时,操作的数据是c的,

第二步在执行时,操作的数据是e的,最后执行时,操作的数据是d的。

Partitions

如果查询是基于分区表的话, 会显示查询访问的分区。

Type

Type表示访问类型,以下为最好的到最差的访问类型的排列

结果值最好到最差:

Type:null、system、const、eq_ref、ref、range、index、ALL

type要求:

一般来说,保证查询至少达到range级别;

最好能达到ref。

NULL

Null是最好的访问方式,mysql对语句进行优化分解后,在执行阶段用不着访问表或者索引(在索引列中查询最小值)。

EXPLAIN
SELECT MIN(ID) FROM EMPLOYEE WHERE ID < 10;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
| 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 | Select tables optimized away |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
1 row in set, 1 warning (0.03 sec

可以看到此时的type的类型为null,不经过扫描表或者索引,访问的效率是最高的

SYSTEM

SYSTEM表示表里只有一行记录时,const类型的特例。

EXPLAIN
SELECT * FROM (SELECT * FROM CUSTOMER LIMIT 1) A;
+----+-------------+------------+------------+--------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table      | partitions | type   | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+------------+------------+--------+---------------+------+---------+------+------+----------+-------+
|  1 | PRIMARY     | <derived2> | NULL       | system | NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL  |
|  2 | DERIVED     | CUSTOMER   | NULL       | ALL    | NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL  |
+----+-------------+------------+------------+--------+---------------+------+---------+------+------+----------+-------+
2 rows in set, 1 warning (0.03 sec)

先执行的id=2的,把子查询里的结果放在临时表里,该临时表只有1行记录,然后在外部查询该临时表,

此时id=1对应的type的值为system。

Const

确定只有一行匹配的时候,mysql优化器会在查询前读取它并且只读取一次,速度非常快;

const用于比较primary 或者 unique索引;直接查询主键或者唯一索引。

EXPLAIN 
SELECT * FROM EMPLOYEE WHERE ID = 1;
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table    | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | EMPLOYEE | NULL       | const | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | NULL  |
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

在查询时,使用了id列的主键索引(或者唯一索引),是唯一的,所以type的结果为const。

System和const对应的记录都只有一条,system对应的是表的记录只有一条;const对应的是通过主键索引或者唯一索引,

只查询到表的记录的一条,两个值都对应一条记录,但是const对应的表的记录不一定只有一行,大部分情况下,

const的情况很多,system很少。

 Eq_ref

对于每个来自于前面的表的行组合,从该表中读取一行,常用在一个索引是unique key或者primary key;

对于每个索引键,表中只有一条记录与之匹配。

EXPLAIN 
SELECT *
FROM   EMPLOYEE   E
      ,DEPARTMENT D
WHERE  E.ID = D.ID;
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------+
| id | select_type | table | partitions | type   | possible_keys | key     | key_len | ref       | rows | filtered | Extra |
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------+
|  1 | SIMPLE      | D     | NULL       | ALL    | PRIMARY       | NULL    | NULL    | NULL      |    5 |   100.00 | NULL  |
|  1 | SIMPLE      | E     | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | demo.D.id |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------+
2 rows in set, 1 warning (0.00 sec)

Id相同,从上往下执行,先对表d进行扫描,然后扫描e;d扫描的结果id的字段与e扫描的结果id进行连接查询,

由于e的id字段有主键索引,所以对与该表的扫描的type为eq_ref。 

Ref

对于来自前面的表的行组合,所有有匹配索引值的行都从这张表中读取,如果联接只使用键的最左边的前缀,

或如果键不是UNIQUE或PRIMARY KEY(换句话说,如果联接不能基于关键字选择单个行的话),则使用ref。

ref可以用于使用=或<=>操作符的带索引的列;

非唯一性索引扫描,返回匹配某个单独值的所有行;

本质上也是一种索引访问;

它返回所有匹配某个单独值的行;

可能会找到多个符合条件的行,;

所以它应该属于查找和扫描的混合体。

查询employee表dep_id和department表的id字段。
SELECT E.DEP_ID AS E_DEP_ID
      ,D.ID     AS D_ID
FROM   EMPLOYEE   E
      ,DEPARTMENT D
WHERE  E.DEP_ID = D.ID;
+----------+------+
| E_DEP_ID | D_ID |
+----------+------+
|        1 |    1 |
|        1 |    1 |
|        1 |    1 |
|        4 |    4 |
|        4 |    4 |
+----------+------+
5 rows in set (0.01 sec)
查看该执行计划:
+----+-------------+-------+------------+--------+---------------+---------+---------+---------------+------+----------+-------------+
| id | select_type | table | partitions | type   | possible_keys | key     | key_len | ref           | rows | filtered | Extra       |
+----+-------------+-------+------------+--------+---------------+---------+---------+---------------+------+----------+-------------+
|  1 | SIMPLE      | E     | NULL       | ALL    | NULL          | NULL    | NULL    | NULL          |    8 |   100.00 | Using where |
|  1 | SIMPLE      | D     | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | demo.E.dep_id |    1 |   100.00 | Using index |
+----+-------------+-------+------------+--------+---------------+---------+---------+---------------+------+----------+-------------+
2 rows in set, 1 warning (0.00 sec)

对于表e的扫描的type为all,全表扫描。

在e表的dep_id字段建立索引:

create index idx_emp_01 on employee(dep_id);
再次查看执行计划:
+----+-------------+-------+------------+-------+---------------+------------+---------+-----------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key        | key_len | ref       | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+------------+---------+-----------+------+----------+-------------+
|  1 | SIMPLE      | D     | NULL       | index | PRIMARY       | PRIMARY    | 4       | NULL      |    5 |   100.00 | Using index |
|  1 | SIMPLE      | E     | NULL       | ref   | idx_emp_01    | idx_emp_01 | 5       | demo.D.id |    2 |   100.00 | Using index |
+----+-------------+-------+------------+-------+---------------+------------+---------+-----------+------+----------+-------------+
2 rows in set, 1 warning (0.00 sec)

对于e表的type由all变成了ref,表示使用了索引,但是由于dep_id的值1多个重复值,因此会根据该值查询出多个记录,

所以该type为ref,表示使用了索引,但是由于存在重复值,因此只能是ref。

Range

索引范围扫描:只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引。

key_len包含所使用索引的最长关键元素。在该类型中ref列为NULL,当使用=、<>、>、>=、<、<=、IS NULL、<=>、

BETWEEN或者IN操作符,用常量比较关键字列时,可以使用range。

这种范围扫描索引比全表扫描要好,因为它只需要开始于索引的某一点而结束语另一点,不用扫描全部索引。

EXPLAIN 
SELECT * FROM EMPLOYEE E WHERE ID BETWEEN 1 AND 3;
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | E     | NULL       | range | PRIMARY       | PRIMARY | 4       | NULL |    3 |   100.00 | Using where |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.01 sec)

查询id在1到3之间的数据,由于id有索引,因此是对该字段的索引的范围扫描,type为range。

Index

Full Index Scan 索引全扫描,index与All区别为index类型只遍历索引树,通常比All要快,因为索引文件通常比数据文件要小,

all和index都是读全表,但index是从索引中读取,all是从硬盘当中读取。

EXPLAIN 
SELECT ID FROM EMPLOYEE;
+----+-------------+----------+------------+-------+---------------+------------+---------+------+------+----------+-------------+
| id | select_type | table    | partitions | type  | possible_keys | key        | key_len | ref  | rows | filtered | Extra       |
+----+-------------+----------+------------+-------+---------------+------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | EMPLOYEE | NULL       | index | NULL          | idx_emp_01 | 5       | NULL |    8 |   100.00 | Using index |
+----+-------------+----------+------------+-------+---------------+------------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

查询表里id字段,需要对整个表进行扫描,但是由于id有字段,所以不用从磁盘去扫描全数据,

只需要对整个索引进行全扫描,此时type值为index,表示对索引的全扫描。

All

将全表进行扫描,从硬盘当中读取数据。

EXPLAIN 
SELECT * FROM EMPLOYEE;
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | EMPLOYEE | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    8 |   100.00 | NULL  |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

对全表数据的查询,此时只能对全表进行扫描,采用全表扫描的方式,此时type的值为all,表示全表扫描。

在对表进行扫描的方式有8种,性能依次为null、system、const、eq_ref、ref、range、index、ALL。

其中all是全表扫描,性能最差;index是索引全扫描,性能也不好,因此,尽量想办法时扫描的type值至少是

变为range以上,走索引,并且是高效的索引。

以上就是MySQL执行计划中的各个参数及含义是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL执行计划中的各个参数及含义是什么

本文链接: https://www.lsjlt.com/news/61441.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL执行计划中的各个参数及含义是什么
    本篇文章给大家分享的是有关MySQL执行计划中的各个参数及含义是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧...
    99+
    2022-10-18
  • MySQL执行计划中的各个参数及含义指的是什么
    这期内容当中小编将会给大家带来有关MySQL执行计划中的各个参数及含义指的是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。查看执行计划可以使用explain + SQ...
    99+
    2022-10-18
  • 如何理解MySQL执行计划中的各个参数及含义
    这篇文章给大家介绍如何理解MySQL执行计划中的各个参数及含义,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。本文是对于MySQL执行计划的解析,主要解释了...
    99+
    2022-10-18
  • ajax中各个参数的含义是什么
    本文小编为大家详细介绍“ajax中各个参数的含义是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“ajax中各个参数的含义是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。...
    99+
    2022-10-19
  • ThreadPoolExecutor参数含义及源码执行流程是什么
    今天小编给大家分享一下ThreadPoolExecutor参数含义及源码执行流程是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-07-04
  • PostgreSQL中与执行计划相关的配置参数是什么
    本篇内容主要讲解“PostgreSQL中与执行计划相关的配置参数是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PostgreSQL中与执行计划相关的配置参...
    99+
    2022-10-18
  • oracle 10g初始化参数文件pfile中各参数的含义是什么
    oracle 10g初始化参数文件pfile中各参数的含义是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。pfile中存放...
    99+
    2022-10-19
  • mysql explain中key_len的含义以及计算方法是什么
    这篇文章主要为大家展示了“mysql explain中key_len的含义以及计算方法是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql explain中key_...
    99+
    2023-06-29
  • 数据库中cluster factor对执行计划的影响是什么
    这篇文章主要讲解了“数据库中cluster factor对执行计划的影响是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“数据库中cluster fact...
    99+
    2022-10-18
  • Oracle数据库中索引的常见执行计划是什么
    这篇文章将为大家详细讲解有关Oracle数据库中索引的常见执行计划是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。今天主要介绍下Oracle索引的常见执...
    99+
    2022-10-19
  • 计算机网络中源程序、目标程序、可执行程序的含义是什么
    这篇文章给大家分享的是有关计算机网络中源程序、目标程序、可执行程序的含义是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。源程序:指未编译的,按照一定的程序设计语言规范书写的文本文件。目标程序:指源程序经编译可...
    99+
    2023-06-14
  • Mysql中自定义函数的创建和执行方法是什么
    本文小编为大家详细介绍“Mysql中自定义函数的创建和执行方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mysql中自定义函数的创建和执行方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢...
    99+
    2023-03-13
    mysql
  • 计算机中一个c程序的执行是从什么函数开始
    小编给大家分享一下计算机中一个c程序的执行是从什么函数开始,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一个c程序的执行是从本程序的main函数开始,到main函...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作