当前位置: 首页 > news >正文

EXPLAIN 用法详解(表格)

SQL 执行慢?慢在哪里?EXPLAIN 能做什么? —— 它可以预估执行计划,而不是执行 SQL 本身。EXPLAIN 的意义:了解优化器是怎么走表的

1、基础语法,EXPLAIN怎么写

EXPLAIN SELECT * FROM user WHERE id = 1;
  • EXPLAIN EXTENDED——这是 EXPLAIN 的加强版,除了给出基本的执行计划,还会显示优化器实际执行时是怎么改写你的 SQL 的

  • EXPLAIN FORMAT=JSON——这个是 EXPLAINJSON 格式输出,比传统表格输出更全面,信息更细节,适合程序自动解析或更细粒度分析。

  • EXPLAIN ANALYZE——这是 MySQL 8.0 的“加强版 EXPLAIN”,它会 真正执行语句,并且把真实执行的时间、行数、CPU 使用情况也一起打印出来。

2、重点列含义解析

列名含义常见值典型用法
id查询中执行步骤的序号数字,越大越先执行id 大优先
select_type查询类型SIMPLE, PRIMARY, SUBQUERY是否子查询、派生表
table当前访问的表表名或派生表别名哪个表
partitions分区信息NULL 或分区名用于分区表
type连接类型ALL, index, range, ref, eq_ref越往下性能越好
possible_keys可能用到的索引索引名这里有索引未必用
key实际使用的索引索引名用了哪个索引
key_len使用的索引长度字节数判断是否用上了组合索引
ref哪个列或常数用于索引查找列名、const用什么条件去匹配索引
rows预估扫描行数数字越少越好
filtered过滤后留下的百分比百分数新版本有
Extra额外信息Using filesort, Using temporary关键要看有没有可优化的操作

 3、常见的Extra信息解读:

  • Using index
  • 表示这条查询只用到了索引中的数据,不需要回表去取原表里的行。也叫 覆盖索引扫描(Covering Index Scan)。一般是因为 SELECT 的列都包含在索引里。
  • 实质:只从索引就能拿到需要的列,省掉了去表里再查一趟,I/O 更少,性能好。

  • Using where
  • 表示即使用了索引,也需要再做一次 WHERE 条件过滤,因为索引只定位到了范围,还要额外检查行是否满足条件。
  • SELECT * FROM user WHERE age > 20;
    
  • 如果 age 有索引,那么先用索引定位范围,但大于号范围可能会多扫一些数据,需要后面再筛一遍。

  • Using filesort
  • 表示查询结果需要做 额外排序,而不是直接用索引顺序返回。“filesort” 并不一定是用文件,而是 MySQL 的术语,意思是要在内存里或磁盘里做排序操作。
  • 大表 ORDER BY 没有合适的索引时容易触发,可能会产生大量磁盘临时文件,导致慢。

  • Using temporary
  • 表示执行这条 SQL 时需要用到 临时表 来存放中间结果。常见于 GROUP BYDISTINCTUNION、有子查询的复杂 ORDER BY 等场景。
  • 代价是内存放不下就会写磁盘,慢且占 IO。

  • Impossible WHERE
  • 表示 WHERE 条件永远为假,这条语句根本不会返回数据。通常是写错了条件或者逻辑冲突,比如:
  • SELECT * FROM user WHERE 1 = 0;
    或者
    SELECT * FROM user WHERE id < 1 AND id > 10;
    
  • 有时候是调试 OK,有时候是写错条件了要赶紧排查。

  • Using join buffer
  • 表示执行 JOIN 时,某个表没有走索引,只能用 块嵌套循环 来做匹配。MySQL 会把驱动表(外表)中的行放到一个 join buffer(内存块)里,然后一条条对比匹配内表。
  • 常见于被 JOIN 的表没有合适的索引,导致全表扫描做匹配。通常会让 EXPLAIN 里的 type 看到 ALL(全表扫)。
  • 后果就是块读性能远不如索引匹配,特别是大表 JOIN 时很耗时。

http://www.dtcms.com/a/289245.html

相关文章:

  • 数据结构-线性表顺序表示
  • 【Linux内核模块】导出符号详解:模块间的“资源共享”机制
  • 子查询转连接查询
  • 30天打牢数模基础-模糊综合评价讲解
  • Vue基础(21)_Vue生命周期
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 用户注册实现
  • 《拆解WebRTC:NAT穿透的探测逻辑与中继方案》
  • 力扣49:字母异形词分组
  • 处理Electron Builder 创建新进程错误 spawn ENOMEM
  • 下载win10的方法
  • 构建一个简单的Java框架来测量并发执行任务的时间
  • Linux安装jdk和maven教程
  • 论文解读:基于时域相干累积的UWB Radar 生命体征检测
  • PyTorch里的张量及张量的操作
  • The FastMCP Client
  • 反欺诈业务 Elasticsearch 分页与导出问题分析及解决方案
  • Kotlin函数式接口
  • 第六章 提炼:萃取本质--创建第二大脑读书笔记
  • 【esp32s3】4 - 从零开始入门 MQTT
  • Selenium 处理动态网页与等待机制详解
  • 谷歌开源项目MCP Toolbox for Databases实操:Docker一键部署与配置指南
  • zabbix服务器告警处理
  • 搜索文本2.6.2(从word、wps、excel、pdf和txt文件中查找文本的工具)
  • Web服务压力测试工具hey学习一:使用方法
  • seo优化
  • UE5多人MOBA+GAS 番外篇:移植Lyra的伤害特效(没用GameplayCue,因为我失败了┭┮﹏┭┮)
  • 均值漂移累积监测算法(MDAM):原理、命名、用途及实现
  • C++现代编程之旅:从基础语法到高性能应用开发
  • JavaScript 对象操作、继承与模块化实现
  • 深度学习图像分类数据集—八种贝类海鲜食物分类