如何使用 MySQL 的 EXPLAIN 语句进行查询分析?

EXPLAIN 是 MySQL 提供的分析 SQL 查询执行计划的工具,用于了解查询语句的执行过程,帮助优化查询性能。


1. EXPLAIN 的使用方法

基本语法

EXPLAIN SELECT * FROM table_name WHERE conditions;

或者:

EXPLAIN FORMAT=JSON SELECT * FROM table_name WHERE conditions;
  • EXPLAIN 会返回查询的执行计划信息,包括涉及的表、索引的使用情况、扫描方式等。
  • FORMAT=JSON 提供结构化的 JSON 格式信息,包含更详细的执行计划内容。

2. EXPLAIN 输出的字段解释

EXPLAIN 的输出包含多个字段,常见字段如下:

字段名 说明
id 查询中每个操作的标识符,查询的执行顺序从大到小。
select_type 查询类型,如简单查询、子查询、联合查询等(SIMPLEPRIMARYSUBQUERY 等)。
table 当前查询操作涉及的表名。
partitions 表示使用的分区(如果有分区表)。
type 访问类型,表示查询操作的效率,类型从好到差依次为:system > const > eq_ref > ref > range > index > ALL
possible_keys 查询可能使用的索引。
key 查询实际使用的索引。
key_len 使用索引的字节长度,反映索引使用的精确性。
ref 表示使用索引的比较列。
rows MySQL 估计需要扫描的行数,行数越少,查询性能越高。
filtered 表示返回结果占扫描行数的百分比,值越大越好。
Extra 额外信息,如 Using index(覆盖索引)、Using where(条件过滤)、Using temporary(临时表)。

3. 示例分析

示例 1:简单查询

EXPLAIN SELECT * FROM orders WHERE customer_id = 1001;

输出示例

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE orders ref customer_id customer_id 4 const 10 Using where; Using index
  • type: ref 表示使用索引访问数据。
  • key: 使用了 customer_id 索引。
  • Extra: Using where; Using index 表示通过索引过滤数据并直接返回结果,性能较优。

示例 2:范围查询

EXPLAIN SELECT * FROM orders WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31';

输出示例

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE orders range order_date order_date 3 NULL 1500 Using where
  • type: range 表示索引范围扫描。
  • rows: 扫描约 1500 行,查询效率较高。
  • Extra: Using where 表示查询条件在索引范围内过滤数据。

示例 3:子查询

EXPLAIN SELECT * FROM orders WHERE customer_id IN (SELECT id FROM customers WHERE country = 'USA');

输出示例

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY orders ref customer_id customer_id 4 const 500 Using where
2 SUBQUERY customers range country country 20 NULL 100 Using where; Using index
  • id: 子查询的 id 为 2,主查询的 id 为 1,表示子查询先执行。
  • Extra: Using index 表示子查询的结果通过索引直接返回,性能较优。

示例 4:JOIN 查询

EXPLAIN SELECT o.* FROM orders o JOIN customers c ON o.customer_id = c.id WHERE c.country = 'USA';

输出示例

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE c ref country country 20 const 100 Using where
1 SIMPLE o ref customer_id customer_id 4 c.id 500 Using where
  • 执行顺序: 表 c 的过滤条件先执行,然后通过 customer_id 的索引关联表 o
  • 优化建议: 确保 countrycustomer_id 字段上有合适的索引。

4. EXPLAIN 的常见优化点

  1. 优先使用合适的索引

    • 查看 possible_keyskey,确保查询语句能命中预期的索引。
  2. 优化扫描范围

    • 避免 typeALLindex,优先通过 refrange 等高效方式访问数据。
  3. 减少扫描行数

    • 查看 rows 字段,减少扫描的行数,降低查询的 I/O 成本。
  4. 消除临时表和文件排序

    • 如果 Extra 中出现 Using temporaryUsing filesort,尝试优化语句,避免使用临时表或文件排序。
  5. 使用覆盖索引

    • 确保查询可以通过索引直接返回所需数据,避免回表操作。

总结

EXPLAIN 是优化 MySQL 查询性能的重要工具,可以帮助我们理解查询的执行计划和潜在的性能问题。通过合理使用索引、优化查询语句、减少扫描范围,可以大幅提升查询效率。

如何使用 MySQL 的 EXPLAIN 语句进行查询分析?的更多相关文章

  1. mysql 常用 sql 语句 - 快速查询

    Mysql 常用 sql 语句 - 快速查询 1.mysql 基础 1.1 mysql 交互         1.1.1 mysql 连接             mysql.exe -hPup    ...

  2. MySQL的explain语句分析

    +----+-------------+-------+------------+------+---------------+-----+---------+------+------+------ ...

  3. MySQL中explain语句的使用

    一.概述 在 MySQL 中,我们可以使用慢查询日志或者 show processlist 命令等方式定位到执行耗时较长的 SQL 语句,在这之后我们可以通过 EXPLAIN或者 DESC 命令获取 ...

  4. MySQL 的 EXPLAIN 语句及用法

    在MySQL中 DESCRIBE 和 EXPLAIN 语句是相同的意思.DESCRIBE 语句多用于获取表结构,而 EXPLAIN 语句用于获取查询执行计划(用于解释MySQL如何执行查询语句). 通 ...

  5. 【Explain】mysql之explain详解(分析索引的最佳使用)

    在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain 这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句 ...

  6. MySQL:explain 和 慢查询日志

    1. 执行SQL时显示执行情况 explain + SQL语句 2. 强制使用索引 select  *  from  t  force  index (a)  where  a  between  1 ...

  7. PHP获取MySQL执行sql语句的查询时间

    //计时开始 runtime(); //执行查询 mysql_query($sql); //计时结束. echo runtime(1); //计时函数 function runtime($mode=0 ...

  8. (转载)PHP怎么获取MySQL执行sql语句的查询时间

    (转载自CSDN) 方法一: //计时开始 runtime(); //执行查询 mysql_query($sql); //计时结束. echo runtime(1); //计时函数 function ...

  9. sql server 最近执行语句统计查询分析

    查询语句: select * from ( SELECT [RowNumber],DATEDIFF(second, StartTime, isnull(EndTime ,StartTime)) 执行时 ...

  10. MySQL索引,MySQL性能分析及explain的使用,分析SQL查询性能

    可以使用explain来分析MySQL查询性能,举例如下: 1.使用explain语句去查看分析结果 如 explain select * from test1 where id=1; 会出现: id ...

随机推荐

  1. playwright相关

    Playwright 介绍 Playwright 是一个用于自动化浏览器操作的开源工具,由 Microsoft 开发和维护.它支持多种浏览器(包括 Chromium.Firefox 和 WebKit) ...

  2. Luogu P5663 CSP-J2019 加工零件 题解 [ 绿 ] [ 分层图最短路 ]

    加工零件:非常好的一道图论题.CCF 普及组的题目大概也只有图论出的比较巧妙了. 题意简述:给你一张无向图,\(q\) 次询问,判断是否存在一条从 \(a\) 到 \(1\) 且长度为 \(L\) 的 ...

  3. FreeSql学习笔记——11.LinqToSql

    前言   Linq的强大大家有目共睹,可以以简便的方式对数据集进行复杂操作,LinqToSql经常使用在数据库的联表.分组等查询操作中:FreeSql对LinqToSql的支持通过扩展包FreeSql ...

  4. 燕千云ITSM已支持DeepSeek对接!AI能力持续升级

    春节期间,DeepSeek火爆全网,引发热议,作为国产AI大模型的黑马,DeepSeek凭借独特的训练方法.先进的模型架构和强大的联网推理能力,正不断拓展AI技术的应用边界.其"快思考&qu ...

  5. 一种将历史地图坐标配准到GIS中的方法

    经常我们看到历史地图影像,比如谭图里面的各个历史朝代的大地图, 然后我们希望利用这个影像作为图层或者叫底图,然后在GIS软件上编辑一些矢量文件, 从而产生的地图矢量文件具有真实的经纬度坐标,不是单单的 ...

  6. YASKAWA安川机器人DX100轴控制基板维修解析知识

    ASKAWA安川机器人DX100轴控制基板的维修是一项复杂而精细的工作,要求具备丰富的知识和实践经验.通过与子锐机器人维修联系,希望能企业提供一些有益的参考和帮助,在面对轴板故障时能够迅速准确地找到问 ...

  7. IAP升级(STM32)

    IAP升级(STM32) IAP作用简述:将要升级的程序bin文件通过串口发送给STM32,STM32接收后存储到FLASH或者SRAM,用户通过事件(按键等)触发(也可延时自动触发)后将升级 文件夹 ...

  8. Linux - vi & vim 编辑器

    vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计. vim 是从vi发展出来的一个文本编辑器.代码补全.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用. 使 ...

  9. maven - [01] 概述

    Maven -- 项目管理及自动构建工具 001 || maven是什么   Maven 是一个由Apache软件基金会提供的项目管理及自动构建工具,主要用于Java编程.它基于项目对象模型(POM) ...

  10. Java进阶 - [1-4] 反射

    一.类加载区别 当我们刚接触java语言的时候,我们最常见的代码应该就是初始化某个对象,然后调用该对象的方法. 1.使用new创建对象,返回对象的引用.Student student = new St ...