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

SQL执行计划解读

MySQL中的执行计划(Execution Plan)是查询优化器对SQL语句解析后生成的执行策略。通过分析执行计划,可以了解MySQL如何访问表、使用索引、进行联接等操作,有助于优化查询性能。

MySQL 提供了 EXPLAIN 命令来查看查询语句的执行计划。

如何查看执行计划

使用 EXPLAIN 或 EXPLAIN FORMAT=JSON 查看执行计划。

基本语法
EXPLAIN SELECT * FROM table_name WHERE ...;
JSON格式
EXPLAIN FORMAT=JSON SELECT * FROM table_name WHERE ...;
  • JSON 格式提供了更详细的信息,适用于复杂查询的深度分析。

执行计划的输出字段

1. 关键字段解释

运行 EXPLAIN 后,会返回以下常见字段:

6bc0e74412b9109eb311e9ad142a3500.jpeg

2. 常见字段值解读
select_type
  • SIMPLE: 简单查询,不包含子查询或联合查询。

  • PRIMARY: 最外层查询。

  • SUBQUERY: 子查询。

  • DERIVED: 派生表(子查询产生的临时表)。

  • UNION: 联合查询。

  • DEPENDENT SUBQUERY: 子查询依赖外层查询结果。

table
  • 物理表或别名

  • 临时表

  • NULL 值:当查询优化器通过某些优化技术避免了实际表访问时(如 WHERE 条件被完全优化),table 字段可能显示为 NULL

type(访问类型)

类型

描述

system

表中只有一行(system table)。性能最好。

const

常量查询,例如主键或唯一索引等限制查询结果只有一行。

eq_ref

联接查询中,针对主键或唯一索引的精确匹配。

ref

非唯一索引扫描,返回匹配的所有行。

range

范围扫描,通常用于 <>BETWEEN 等范围查询。

index

全索引扫描,索引全部内容扫描,而不是按数据表扫描。

ALL

全表扫描,性能最差。

ref
  • NULL,表示查询不依赖索引列的匹配,通常在全表扫描(type=ALL)或索引扫描(type=index)时出现。

  • 常量值(const),表示索引列与一个常量值进行比较。

  • 列引用,表示索引列与另一张表的列进行比较,通常出现在表联接中,联接条件使用了索引。

  • 常量列表(const,const,...),表示索引列与一组常量值进行比较,常见于 IN 查询。

Extra
  • Using index:表示覆盖索引,无需回表。

  • Using where:表示使用了 WHERE 条件过滤数据。

  • Using temporary:查询需要创建临时表,例如 ORDER BY 和 GROUP BY。

  • Using filesort:MySQL 使用外部排序,通常是内存或磁盘操作。

  • Using join buffer:联接时使用了缓冲区,通常表示索引未被有效利用。

示例分析

1. 简单查询
EXPLAIN SELECT * FROM employees WHERE id = 1;

输出:

id

select_type

table

type

possible_keys

key

key_len

ref

rows

Extra

1

SIMPLE

employees

const

PRIMARY

PRIMARY

4

const

1

Using index

解释:

  • type = const:主键查询。

  • key = PRIMARY:使用了主键索引。

  • Extra = Using index:覆盖索引查询,无需回表。

2. 范围查询
EXPLAIN SELECT * FROM employees WHERE age > 30;

输出:

id

select_type

table

type

possible_keys

key

key_len

ref

rows

Extra

1

SIMPLE

employees

range

age_index

age_index

4

NULL

500

Using where

解释:

  • type = range:使用范围扫描。

  • key = age_index:查询使用了 age 列的索引。

  • Extra = Using where:WHERE 条件过滤数据。

3. 联表查询
EXPLAIN SELECT * FROM orders o JOIN customers c ON o.customer_id = c.id;

输出:

id

select_type

table

type

possible_keys

key

key_len

ref

rows

Extra

1

SIMPLE

customers

ALL

PRIMARY

PRIMARY

4

NULL

1000

NULL

1

SIMPLE

orders

ref

customer_id

customer_id

4

customers.id

500

Using index

解释:

  • type = ALLcustomers 表进行了全表扫描。

  • type = reforders 表使用了外键索引扫描。

  • 联接使用了 customer_id 索引。

执行计划优化建议

  1. 优化访问类型

  • 避免 ALL 和 index 类型,通过创建索引将访问类型优化为 constref 或 range

索引优化

  • 确保 WHERE 子句、联接条件、ORDER BY、GROUP BY 中涉及的列使用索引。

  • 使用覆盖索引(Using index),减少回表操作。

避免临时表和排序

  • 尽量避免 Using temporary 和 Using filesort

  • 对排序和分组列建立索引。

分区表

  • 对大表使用分区,优化扫描范围。

查询重构

  • 拆分复杂查询,减少嵌套子查询或多表联接。

总结

MySQL 的执行计划是优化查询性能的重要工具,使用 EXPLAIN 分析 SQL 语句的执行过程,识别性能瓶颈,通过合理设计索引、重构查询语句和调整表结构来提升查询效率。


http://www.kler.cn/a/452657.html

相关文章:

  • git设置项目远程仓库指向github的一个仓库
  • 一款5k star的 Redis 客户端!!简洁高效!
  • Element-ui的使用教程 基于HBuilder X
  • springboot/ssm社区助老志愿者服务平台Java代码编写web志愿捐赠活动项目
  • Mybatis 小结
  • 基于Spring Boot的工商局商家管理系统
  • 【每日学点鸿蒙知识】获取是否有网接口、获取udid报错、本地通知、Json转Map、Window10安装Hyper-v
  • 《网络对抗》—— Web安全基础实践
  • 【山西长治】《长治市市直部门政务信息化建设项目预算编制规范和预算编制标准》(长财行[2022]25号)-省市费用标准解读系列32
  • 【安全编码】Web平台如何设计防止重放攻击
  • MyBatis中动态SQL执行原理
  • AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python
  • Redis 安装部署[主从、哨兵、集群](linux版)
  • 解决 fatal: detected dubious ownership in repository at ‘XXXX‘ 问题
  • 《计算机组成及汇编语言原理》阅读笔记:p86-p115
  • 理解并使用 Linux 内核的字符设备
  • 鸿蒙开发面试准备和经验
  • RabbitMQ中的普通Confirm模式:深入解析与最佳实践
  • 【spring-cloud-gateway总结】
  • 20241225在ubuntu20.04.5下监控SSD
  • 重温设计模式--5、职责链模式
  • 基于 Nginx 的网站服务器与 LNMP 平台搭建指南
  • 使用ForceBindIP绑定应用到指定IP
  • 第十七届山东省职业院校技能大赛 中职组“网络安全”赛项任务书正式赛题
  • 【Redis】配置序列化器
  • 每天40分玩转Django:Django管理界面