MySQL EXPLAIN,数据库调优的秘密通道

EXPLAIN 是 MySQL 中一个非常有用的工具,它用于分析 SQL 查询的执行计划。通过 EXPLAIN,你可以获取 MySQL 是如何准备执行你的 SQL 语句的,包括使用的索引、连接类型、扫描的行数等信息。这些信息对于优化查询性能、识别性能瓶颈至关重要。

使用方法

EXPLAIN SELECT * FROM your_table WHERE some_column = 'some_value';

输出字段

  1. id:
    查询的标识符。如果查询包含多个子查询或联合查询,MySQL 会为每个子查询分配一个唯一的 id。
    如果 id 相同,表示这些查询是并行执行的。
    如果 id 不同,通常是外层查询的 id 较小,内层查询的 id 较大。
  2. select_type:
    查询的类型,常见的类型有:
    • SIMPLE: 简单的 SELECT 查询,不使用 UNION 或子查询。
    • PRIMARY: 查询中最外层的 SELECT。
    • UNION: UNION 中的第二个或后续的 SELECT 语句。
    • DEPENDENT UNION: UNION 中的第二个或后续的 SELECT 语句,依赖于外部查询。
    • SUBQUERY: 子查询中的第一个 SELECT。
    • DEPENDENT SUBQUERY: 子查询,依赖于外部查询。
    • DERIVED: 派生表的 SELECT(子查询在 FROM 子句中)。
  3. table:
    显示这一行数据是关于哪张表的。
  4. partitions:
    匹配的分区。
  5. type:
    连接类型,表示 MySQL 在找到所需行时使用的访问方法。常见类型有:
    • ALL: 全表扫描,性能最差。
    • index: 全索引扫描(索引的每一行都会被扫描)。
    • range: 使用索引选择给定范围的行。
    • ref: 使用非唯一性索引或唯一性索引的前缀扫描来查找单个匹配行。
    • eq_ref: 使用唯一性索引查找单个匹配行。
    • const, system: 表中最多有一个匹配行,通常在主键或唯一索引中查找。
    • NULL: 不用访问表或索引,例如从子查询中返回的行。
  6. possible_keys:
    显示可能应用在这张表上的索引。
  7. key:
    实际使用的索引。如果为 NULL,则表示没有使用索引。
  8. key_len:
    使用的索引的长度。在某些情况下,不是索引的全部部分都会被使用。
  9. ref:
    显示索引的哪一列或常量被用于查找值。
  10. rows:
    估计为了找到所需的行而要检查的行数。这是一个估计值,不一定完全准确。
  11. filtered:
    表示返回结果的行占开始查找行的百分比。
  12. Extra:
    包含不适合在其他列中显示但对执行计划非常重要的额外信息。常见值有:
  • Using where: 使用 WHERE 过滤。
  • Using temporary: 使用临时表来存储中间结果。
  • Using filesort: MySQL 需要额外的步骤来执行排序。
  • Using index: 只通过索引树读取数据(覆盖索引)。
  • Impossible WHERE: WHERE 子句中的条件永远为 false,不能返回任何行。
  • Distinct: MySQL 正在查找不同的值。

基本使用

假设有一个名为 employees 的表,包含 id, name, department_id, salary 等列,并且有一个索引 idx_department_id 在 department_id 列上。

EXPLAIN SELECT * FROM employees WHERE department_id = 10;

输出

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEemployeesrefidx_department_ididx_department_id4const100Using where
  • type 为 ref,表示使用了非唯一索引查找。
  • key 为 idx_department_id,表示实际使用的索引。
  • rows 为 100,表示估计需要检查的行数。

案例

定义

我们有一个名为 employees 的表,包含以下列:id(主键),name,department_id,salary。我们想要查询 department_id 为 10 的所有员工信息。

-- 假设 employees 表已经存在并且包含数据
EXPLAIN
SELECT *
FROM employees
WHERE department_id = 10;

输出

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEemployeesrefidx_department_ididx_department_id4const100Using where
  • id: 查询的标识符,这里只有一个查询,所以为 1。
  • select_type: 查询类型,SIMPLE 表示简单的 SELECT 查询。
  • table: 查询的表名,这里是 employees。
  • type: 连接类型,ref 表示使用非唯一索引或唯一索引的前缀来查找匹配的行。
  • possible_keys: 可能使用的索引,这里是 idx_department_id。
  • key: 实际使用的索引,这里是 idx_department_id。
  • key_len: 使用的索引的长度。
  • ref: 显示索引的哪一列或常量被用于查找值,这里是 const 表示是一个常量值。
  • rows: 估计为了找到所需的行而要检查的行数。
  • Extra: 额外的信息,这里是 Using where 表示使用了 WHERE 子句进行过滤。

全表扫描

现在我们想要查询所有员工的姓名,并且我们没有在 name 列上创建索引。

-- 假设 employees 表已经存在并且包含数据,且 name 列上没有索引
EXPLAIN
SELECT name
FROM employees;

输出

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEemployeesALLNULLNULLNULLNULL1000000NULL
  • type: 这里是 ALL,表示全表扫描,因为 name 列上没有索引。
  • possible_keys 和 key: 都是 NULL,因为没有可用的索引。
  • rows: 估计需要扫描的行数,这里是一个较大的数,表示全表扫描。

使用覆盖索引

假设我们现在在 name 和 salary 列上创建了一个复合索引,并且我们想要查询这两个列的值。

-- 首先创建复合索引(如果尚未存在)
CREATE INDEX idx_name_salary ON employees (name, salary);-- 然后使用 EXPLAIN 查看查询计划
EXPLAIN
SELECT name, salary
FROM employees
WHERE name = 'John Doe';

输出

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEemployeesrefidx_name_salaryidx_name_salary767const1Using index
  • type: 这里是 ref,表示使用非唯一索引查找。
  • key: 使用了我们刚刚创建的复合索引 idx_name_salary。
  • Extra: Using index 表示只通过索引树读取数据(覆盖索引),因为查询的列 name 和 salary 都包含在索引中。

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

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

相关文章

uniapp vue里按钮上的文字,换行的方法,用rich-text

<rich-text class"caption-1" v-if"voiceTis 识别中...点击停止" v-html"formattedVoiceTis"></rich-text> <text class"caption-1" v-else>{{ formattedVoiceTis }}</text&g…

为什么hbase在大数据领域渐渐消失

HBase 曾是大数据存储领域的标杆之一,凭借其强大的分布式、列式存储和高扩展性,广泛应用于电商、社交网络、金融等需要海量数据管理的场景。然而,近年来 HBase 的使用确实在减少,这主要是因为数据技术栈的演变和用户需求的变化。以下是一些主要原因: 1. 复杂的运维和管理…

Charles抓https包-配置系统证书(雷电)

1、导出证书 2、下载 主页上传资源中有安装包&#xff0c;免费的 openssl 安装教程自己搜 openssl x509 -subject_hash_old -in charles.pem 3、修改证书名、后缀改成点0 雷电打开root和磁盘写入 4、导入雷电证书根目录 证书拖进去&#xff0c;基本就完成了&#xff…

Ansible内置模块之known_hosts

Ansible内置模块之 known_hosts ansible.builtin.known_hosts 模块允许您在 known_host 文件中添加或删除主机公钥。从 Ansible 2.2开始&#xff0c;每个主机允许多个条目&#xff0c;但 ssh 支持的每个公钥类型只能有一个条目。例如&#xff0c;如果您想在 ssh 上使用[ansible…

NX二次开发将刀轨转曲线

获取选择的程序刀轨和当前加工坐标系&#xff0c;获取刀轨数据点转换到加工坐标系&#xff0c;然后创建样条&#xff0c;创建样条是用UG录制的代码&#xff0c;有更好的方法欢迎交流学习一下。 void CreateCurve(){tag_t setup_tag;UF_SETUP_ask_setup(&setup_tag);int co…

Java基础——多线程

1. 线程 是一个程序内部的一条执行流程程序中如果只有一条执行流程&#xff0c;那这个程序就是单线程的程序 2. 多线程 指从软硬件上实现的多条执行流程的技术&#xff08;多条线程由CPU负责调度执行&#xff09; 2.1. 如何创建多条线程 Java通过java.lang.Thread类的对象…

【React】状态管理之Zustand

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 状态管理之Zustand引言1. Zustand 的核心特点1.1 简单直观的 API1.2 无需 Provi…

虎扑APP数据采集:JavaScript与AJAX的结合使用

引言 虎扑APP的数据采集涉及到前端和后端的交互&#xff0c;其中AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;技术允许在不重新加载整个页面的情况下&#xff0c;与服务器进行数据交换和更新部分网页内容。这种技术使得数据采集过程更加高效和用户友好。然而…

高级数据结构——hash表与布隆过滤器

文章目录 hash表与布隆过滤器1. hash函数2. 选择hash函数3. 散列冲突3.1 负载因子3.2 冲突解决3. STL中的散列表 4. 布隆过滤器4.1 背景1. 应用场景2. 常见的处理场景&#xff1a; 4.2 布隆过滤器构成4.3 原理4.4 应用分析4.5 要点 5. 分布式一致性hash5.1 缓存失效问题 6. 大数…

测试实项中的偶必现难测bug--互斥逻辑异常

问题: 今天线上出了一个很奇怪的问题,看现象和接口是因为数据问题导致app模块奔溃 初步排查数据恢复后还是出现了数据重复的问题,查看后台实际只有一条数据,但是显示在app却出现了两条一模一样的置顶数据 排查: 1、顺着这个逻辑,我们准备在预发复现这个场景,先是cop…

算法训练(leetcode)二刷第二十八天 | 509. 斐波那契数、70. 爬楼梯、*746. 使用最小花费爬楼梯

刷题记录 509. 斐波那契数70. 爬楼梯*746. 使用最小花费爬楼梯动态规划优化空间复杂度 509. 斐波那契数 leetcode题目地址 时间复杂度&#xff1a; O ( n ) O(n) O(n) 空间复杂度&#xff1a; O ( 1 ) O(1) O(1) // java class Solution {public int fib(int n) {if(n<…

基于Java Web 的家乡特色菜推荐系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

RabbitMQ实战启程:从配置到故障排查的实战处理(下)

文章目录 七、RabbitMQ配置详解八、RabbitMQ优化8.1 加大服务器带宽8.2 加大内存8.3 使用固态硬盘8.4 增加生产者8.5 增加消费者8.6 改网络访问为本地访问8.7 消费端使用长连接8.8 消息不要超过4M 九、监控十、常见故障与排查10.1 消费慢10.2 消息丢失10.2.1 生产者消息丢失10.…

【计算机体系架构】 MESI缓冲一致性

高并发学习参考 https://blog.csdn.net/MrYushiwen/article/details/123049838 https://cloud.tencent.com/developer/article/2197857 ESI 是指Cache 行的三种一致性状态&#xff1a;E&#xff08;Exclusive&#xff0c;独占&#xff09;&#xff0c;S&#xff08;Shared&…

C++中特殊类设计/单例模式

特殊类设计 ​ 本篇将会介绍一些特殊类的设计&#xff1a;不能拷贝的类、只能在堆上创建的类、只能在栈上创建的对象、不能被继承的类、只能创建一个对象的类&#xff08;单例模式&#xff09;。 文章目录 特殊类设计不能被拷贝的类只能在堆上创建对象的类只能在栈上创建对象…

【代码大模型】Is Your Code Generated by ChatGPT Really Correct?论文阅读

Is Your Code Generated by ChatGPT Really Correct? Rigorous Evaluation of Large Language Models for Code Generation key word: evaluation framework, LLM-synthesized code, benchmark 论文&#xff1a;https://arxiv.org/pdf/2305.01210.pdf 代码&#xff1a;https:…

SpringBoot集成Dynamo(2)demo

一、dynamo local 1、建表 aws dynamodb create-table --table-name t_user --attribute-definitions AttributeNameuser_account,AttributeTypeS AttributeNameuser_name,AttributeTypeS --key-schema AttributeNameuser_account,KeyTypeHASH AttributeNameuser_name,KeyType…

Godot的开发框架应当是什么样子的?

目录 前言 全局协程还是实例协程&#xff1f; 存档&#xff01; 全局管理类&#xff1f; UI框架&#xff1f; Godot中的异步&#xff08;多线程&#xff09;加载 Godot中的ScriptableObject 游戏流程思考 结语 前言 这是一篇杂谈&#xff0c;主要内容是对我…

坚果云·无法连接服务器(无法同步)

cmd&#xff0c;右键选择&#xff1a;以管理员身份打开输出netsh winsock reset&#xff0c;重启计算机即可 &#xff08;这是由于某些代理防火墙导致的&#xff1b;关闭代理&#xff0c;使用代理设置清理器&#xff09; 如果还不行&#xff0c; 换用移动热点、关闭有线网络&a…

Spring Boot框架:电商系统的设计与实现

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本网上商城系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&…