MySQL执行计划查看和解读

news/2024/9/22 20:44:38/

在MySQL中,要查看SQL查询的执行计划,可以使用EXPLAIN关键字。这可以帮助你理解MySQL是如何处理你的查询的,包括它如何选择索引、表的连接顺序等。

如何开启执行计划查看

  1. 使用EXPLAIN关键字
    在你的SQL语句前加上EXPLAIN关键字即可查看执行计划。

  2. 使用EXPLAIN FORMAT选项
    MySQL还支持不同的输出格式,例如JSONTRADITIONAL等。

基本语法

EXPLAIN [FORMAT={TRADITIONAL | JSON}] SELECT ...;

示例

假设有一个名为employees的表,并且你想查看一个特定查询的执行计划:

EXPLAIN SELECT * FROM employees WHERE department = 'sales';

或者如果你想查看输出为JSON格式:

EXPLAIN FORMAT=JSON SELECT * FROM employees WHERE department = 'sales';

执行计划输出的列说明

  1. id: 查询块的编号,同一id表示一个SELECT操作,不同的id表示不同的SELECT操作。

  2. select_type: 查询类型,常见的有:

    • SIMPLE: 简单表,没有其他表依赖。
    • PRIMARY: 最外层查询。
    • UNION: 第二个或之后的UNION查询。
    • DEPENDENT UNION: UNION中的第二个或之后的SELECT列表取决于外面的查询。
    • UNION RESULT: UNION的结果。
    • SUBQUERY: 子查询。
    • DEPENDENT SUBQUERY: 子查询依赖于外部查询。
  3. table: 被查询的表名。

  4. partitions: 当表使用分区时显示被访问的分区。

  5. type: 连接类型,表示访问表的方式,常见的有:

    • ALL: 全表扫描,最慢。
    • index: 全索引扫描。
    • range: 索引范围扫描。
    • ref: 使用非唯一索引扫描。
    • eq_ref: 对唯一索引的扫描。
    • const: 对单行记录的索引扫描。
    • system: 对单行记录的索引扫描,与const相似但更快速。
  6. possible_keys: 可能用于查询的索引。

  7. key: 实际使用的索引。

  8. key_len: 使用的索引字节长度。

  9. ref: 使用的键值或常量。

  10. rows: MySQL估计的需要检查的行数。

  11. filtered: 表示经过WHERE条件过滤后的行百分比。

  12. Extra: 额外信息,可能包含的信息有:

  • Using where: 表示MySQL使用WHERE子句进行过滤。
  • Using index: 表示MySQL只使用索引中的信息而无需访问实际的表行。
  • Using temporary: 使用临时表存储中间结果。
  • Using filesort: 数据需要额外的排序操作。
  • Not exists: 用于优化LEFT JOIN。
  • Using join buffer: 使用连接缓冲区读取数据。
  • Using index condition: 使用索引条件推送(ICP)。

如何解读执行计划

  1. 连接顺序:

    • 查看idselect_type来确定连接的顺序和类型。
    • 如果多个表的id相同,则按照列表中的顺序执行。
  2. 连接类型:

    • 评估type列,优先使用consteq_refref,避免使用ALL
    • 如果typeALL,考虑添加索引来改善性能。
  3. 索引使用:

    • 检查keypossible_keys,确认是否使用了合适的索引。
    • 如果key为空,表示没有使用索引。
  4. 额外信息:

    • 注意Extra列中的提示,如Using filesortUsing temporary,这可能表明需要优化。
    • Using where通常表示MySQL在检索阶段使用了WHERE条件。
  5. 行数估算:

    • 观察rows列来评估MySQL预计的扫描行数,如果过高可能意味着需要优化查询或索引。

示例解读

假设你有以下执行计划输出:

+----+-------------+-------+--------+---------------+---------+---------+------------------+------+-------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref              | rows | Extra       |
+----+-------------+-------+--------+---------------+---------+---------+------------------+------+-------------+
|  1 | SIMPLE      | emp   | range  | idx_name      | idx_name| 10      | NULL             |    5 | Using where |
|  1 | SIMPLE      | dept  | eq_ref | PRIMARY       | PRIMARY | 4       | database.emp.dept|    1 | NULL        |
+----+-------------+-------+--------+---------------+---------+---------+------------------+------+-------------+
  • 解读:
    • id: 1,表示这是一个简单的SELECT操作。
    • select_type: SIMPLE,简单查询。
    • table: emp 和 dept,查询涉及的两个表。
    • type: range 和 eq_ref,emp表使用了范围索引扫描,dept表使用了唯一索引。
    • possible_keys: idx_name,表示emp表可以使用idx_name索引。
    • key: idx_name 和 PRIMARY,使用的索引。
    • key_len: 10 和 4,索引的长度。
    • ref: NULL 和 database.emp.dept,dept表的索引使用了emp表的dept字段作为参考。
    • rows: 5 和 1,MySQL估计需要检查的行数。
    • Extra: Using where,表示MySQL使用了WHERE条件来过滤emp表。

根据以上信息,我们可以得出结论:此查询首先对emp表使用了索引idx_name进行范围扫描,并应用WHERE条件进行过滤;然后通过dept表的主键进行等值匹配,连接两个表。


http://www.ppmy.cn/news/1504171.html

相关文章

【计算机网络】[第二章][自用]

1 传输媒体 (1)分类: (2)导向型: ①同轴电缆: ②双绞线: ③光纤:

2024年06月 Scratch 图形化(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch图形化等级考试(1~4级)全部真题・点这里 一、单选题(共18题,共50分) 第1题 运行程序后,角色的x坐标是?( ) A:99 B:100 C:199 D:200 答案:D 在程序进入循环前,小猫的x坐标被设为了100,循环结束后,坐标变化这个变量的值为100;最后小猫面向90方向移…

【设计模式】设计模式之观察者模式

文章目录 观察者模式什么是观察者模式引入组成UML图代码实现1. 定义观察者接口2. 定义主题接口3. 实现具体观察者4. 实现具体被观察者5.测试 应用场景优点缺点 观察者模式 什么是观察者模式 观察者模式(Observer Pattern)是一种设计模式 它定义了一种…

jdk版本管理利器-sdkman

1.什么是sdkman? sdkman是一个轻量级、支持多平台的开源开发工具管理器,可以通过它安装任意主流发行版本(例如OpenJDK、Kona、GraalVM等等)的任意版本的JDK。通过下面的命令可以轻易安装sdkman: 2.安装 curl -s "https://…

初识godot游戏引擎并安装

简介 Godot是一款自由开源、由社区驱动的2D和3D游戏引擎。游戏开发虽复杂,却蕴含一定的通用规律,正是为了简化这些通用化的工作,游戏引擎应运而生。Godot引擎作为一款功能丰富的跨平台游戏引擎,通过统一的界面支持创建2D和3D游戏。…

字符专用输入输出函数 getchar() putchar()

文章目录 一、字符专用接收函数1.1 scanf实现字符接收1.2 字符专用接收函数getchar1.3 练习1.4 利用循环使字符接收函数接收字符串的元素 二、字符专用输出函数2.1 printf实现打印字符2.2 字符专用输出函数putchar 提示:以下是本篇文章正文内容,下面案例…

正点原子imx6ull-mini-Linux驱动之platform设备驱动实验(14)

我们在前面几章编写的设备驱动都非常的简单,都是对IO进行最简单的读写操作像I2C、 SPI、LCD 等这些复杂外设的驱动就不能这么去写了,Linux 系统要考虑到驱动的可重用性,因此提出了驱动的分离与分层这样的软件思路,在这个思路下诞生…

python 去除验证码图片噪音

在处理验证码图片时,出现噪音,如横线、像素点等问题往往会影响识别率,这里给出一个去除噪音的方法,仅供学习。 import cv2 import os import numpy as np import copydef del_noise(img, number):height img.shape[0]width img…