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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
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同时存在,且作用于不同的字段时,

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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
7月前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
|
9月前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
1706 10
|
10月前
|
缓存 关系型数据库 MySQL
MySQL执行计划选择策略:揭秘查询优化的艺术
【10月更文挑战第15天】 在数据库性能优化中,选择最优的执行计划是提升查询效率的关键。MySQL作为一个强大的关系型数据库管理系统,提供了复杂的查询优化器来生成执行计划。本文将深入探讨如何选择合适的执行计划,以及为什么某些计划更优。
346 2
|
10月前
|
缓存 关系型数据库 MySQL
MySQL执行计划深度解析:如何做出最优选择
【10月更文挑战第23天】 在数据库查询性能优化中,执行计划的选择至关重要。MySQL通过查询优化器来生成执行计划,但有时不同的执行计划会导致性能差异。理解如何选择合适的执行计划,以及为什么某些计划更优,对于数据库管理员和开发者来说是一项必备技能。
658 2
|
10月前
|
SQL 关系型数据库 MySQL
美团面试:Mysql如何选择最优 执行计划,为什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴面试美团时遇到了关于MySQL执行计划的面试题:“MySQL如何选择最优执行计划,为什么?”由于缺乏系统化的准备,小伙伴未能给出满意的答案,面试失败。为此,尼恩为大家系统化地梳理了MySQL执行计划的相关知识,帮助大家提升技术水平,展示“技术肌肉”,让面试官“爱到不能自已”。相关内容已收录进《尼恩Java面试宝典PDF》V175版本,供大家参考学习。
|
11月前
|
SQL 关系型数据库 MySQL
MySQL EXPLAIN该如何分析?
本文将详细介绍MySQL中`EXPLAIN`关键字的工作原理及结果字段解析,帮助优化查询性能。`EXPLAIN`可显示查询SQL的执行计划,其结果包括`id`、`select_type`、`table`等字段。通过具体示例和优化建议,帮助你理解和应用`EXPLAIN`,提升数据库查询效率。
551 1
|
12月前
|
SQL 存储 关系型数据库
深入 MySQL 的执行计划与性能优化
深入 MySQL 的执行计划与性能优化
153 0
|
SQL 关系型数据库 MySQL
mysql性能调优:EXPLAIN命令21
【7月更文挑战第21天】掌握SQL性能调优:深入解析EXPLAIN命令的神奇用法!
151 1
|
SQL 缓存 关系型数据库
MySQL|浅谈explain的使用
【7月更文挑战第11天】

推荐镜像

更多