庖丁解牛,MySQL执行计划Explain的2大核心

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 庖丁解牛,MySQL执行计划Explain的2大核心

🍁 一、Explain中的“Type”



c297594ff7ee46d1b4f273406b5b736c.png



Explain中的“Type”

MySQL的官网解释为:连接类型(the join type)。它描述了找到所需数据使用的扫描方式。


最为常见的扫描方式有:

system:系统表,少量数据,往往不需要进行磁盘IO;

const:常量连接;

eq_ref:主键索引(primary key)或者非空唯一索引(unique not null)等值扫描;

ref:非主键非唯一索引等值扫描;

range:范围扫描;

index:索引树扫描;

ALL:全表扫描(full table scan);

上面各类扫描方式由快到慢:

system > const > eq_ref > ref > range > index > ALL


🍃1.1 system

扫码类型为system,说明数据已经加载到内存里,不需要进行磁盘IO。

这类扫描是速度最快的。

但是我没有遇到过,遇到了我再来补充!


🍃1.2 const

explain select id from account_user_base where id =1;

const扫描的条件为:

(1)命中主键(primary key)或者唯一(unique)索引;

(2)被连接的部分是一个常量(const)值;


🍃1.3 eq_ref

eq_ref扫描的条件为:对于前表的每一行(row),后表只有一行被扫描。

我也没有遇到!非常少见


🍃1.4 ref

explain select * from account_user_base t1,account_user_security t2 where t1.id = t2.user_id;

对于前表的每一行(row),后表可能有多于一行的数据被扫描。


🍃1.5 range

explain select * from account_user_base where id > 4;

range类型,它是索引上的范围查询,它会在索引上扫码特定范围内的值。


🍃1.6 index

explain select id from account_user_base;

index类型,需要扫描索引上的全部数据。


🍃1.7 ALL

explain select * from account_user_base;

全表扫描


🍃1.8总结


system最快:不进行磁盘IO

const:PK或者unique上的等值查询

eq_ref:PK或者unique上的join查询,等值匹配,对于前表的每一行(row),后表只有一行命中

ref:非唯一索引,等值匹配,可能有多行命中

range:索引上的范围扫描,例如:between/in/>

index:索引上的全集扫描

ALL最慢:全表扫描(full table scan)


🍁二、Explain中的“Extra”


bb54f7db821a40ca9afcbc4f6d9b2f75.png



Explain中的“Extra”

从上图我们得知,Extra的值有

NULL、Using index、Using where、Using index condition、Using filesort、Using temporary


🍃2.1 Using where

explain select * from account_user_base where id > 4;

Extra为Using where说明,SQL使用了where条件过滤数据。


🍃2.2 Using index

explain select id from account_user_base;

Extra为Using index说明,SQL所需要返回的所有列数据均在一棵索引树上,

而无需访问实际的行记录。


🍃2.3 Using index condition

explain select * from account_user_security t1, account_user_base t2 where t1.user_id = t2.id;

Extra为Using index condition说明,确实命中了索引,

但不是所有的列数据都在索引树上,还需要访问实际的行记录。


🍃2.4 Using filesort

explain select id from account_user_base order by nick_name;

Extra为Using filesort说明,得到所需结果集,需要对所有记录进行文件排序。

典型的,在一个没有建立索引的列上进行了order by,

就会触发filesort,常见的优化方案是,在order by的列上添加索引,避免每次查询都全量排序。


🍃2.5 Using temporary

explain select nick_name, COUNT(*) from account_user_base

GROUP BY nick_name order by nick_name;

Extra为Using temporary说明,需要建立临时表(temporary table)来暂存中间结果。

这类SQL语句性能较低,往往也需要进行优化。

典型的,group by和order by同时存在,且作用于不同的字段时,

就会建立临时表,以便计算出最终的结果集。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
SQL 存储 关系型数据库
SQL优化之Explain详解(mysql)
`Explain`是MySQL中用于分析SQL查询执行计划的工具。它可以帮助我们了解MySQL如何执行SQL语句,包括如何使用索引、预计的行数以及查询的顺序。以下是`Explain`输出的关键列及其含义的简要摘要: 1. **id**:查询的序列号,表示查询中的子句层次,id越大优先级越高。 2. **select_type**:表示查询的类型,如SIMPLE(简单查询)、PRIMARY(主查询,多表查询中的第一个查询)、SUBQUERY(子查询)、DERIVED(派生表)或UNION(UNION操作的查询部分)。 3. **table**:查询涉及的表名,如果是子查询,可能显示为衍生表
33 0
|
3天前
|
存储 SQL 关系型数据库
MySQL 底层数据结构 聚簇索引以及二级索引 Explain的使用
MySQL 底层数据结构 聚簇索引以及二级索引 Explain的使用
14 0
|
2月前
|
SQL 缓存 关系型数据库
MySQL的万字总结(缓存,索引,Explain,事务,redo日志等)
MySQL的万字总结(缓存,索引,Explain,事务,redo日志等)
70 0
|
3月前
|
存储 关系型数据库 MySQL
MySQL技能完整学习列表6、查询优化——1、EXPLAIN命令的使用——2、索引优化
MySQL技能完整学习列表6、查询优化——1、EXPLAIN命令的使用——2、索引优化
24 0
|
3月前
|
SQL 存储 关系型数据库
MySQL - Explain详解
MySQL - Explain详解
|
4月前
|
SQL 关系型数据库 MySQL
MySQL SQL性能分析 慢查询日志、explain使用
MySQL SQL性能分析 慢查询日志、explain使用
119 0
|
4月前
|
SQL 机器学习/深度学习 关系型数据库
MySQL - Explain深度剖析
MySQL - Explain深度剖析
43 0
|
5月前
|
SQL 关系型数据库 MySQL
mysql explain 详解及sql优化指南
mysql explain 详解及sql优化指南
31 0
|
5月前
|
关系型数据库 MySQL 数据库
mysq优化---mysql执行计划解释、优化查询、数据库结构、服务器
mysq优化---mysql执行计划解释、优化查询、数据库结构、服务器
|
5月前
|
SQL 存储 关系型数据库
【MySQL】MySQL Explain性能调优详解
【MySQL】MySQL Explain性能调优详解
63 0
【MySQL】MySQL Explain性能调优详解