前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL(九)|如何查看执行计划(Explain)

MySQL(九)|如何查看执行计划(Explain)

作者头像
黄小怪
发布于 2019-07-27 11:56:07
发布于 2019-07-27 11:56:07
2.4K0
举报
文章被收录于专栏:小怪聊职场小怪聊职场

我们经常会使用Explain去查看执行计划,这个众所周知。但我在面试时问面试者,你用Explain主要是看什么?对方的回答大多是“查看是否有使用到索引”,很显然我对这个回答不太满意。 今天我们就来说一说Explain中的“Type”和“Extra”。

一、Explain中的“Type”

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”

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同时存在,且作用于不同的字段时,就会建立临时表,以便计算出最终的结果集。

注:本文大部分内容来自于微信公众号:架构师之路的两篇文章《同一个SQL语句,为啥性能差异咋就这么大呢?(1分钟系列)》、《如何利用工具,迅猛定位低效SQL? | 1分钟系列》 测试的MySQL版本为InnoDB 5.7.22

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.07.26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
听GPT 讲Rust源代码--src/librustdoc
题图来自 Why is building a UI in Rust so hard?[1]
fliter
2023/11/22
2590
听GPT 讲Rust源代码--src/librustdoc
Rust项目中的Labels
按照issue数量从多到少排序: https://github.com/rust-lang/rust/labels?page=2&sort=count-desc,仅列出前几页
fliter
2024/02/26
1680
Rust项目中的Labels
Rust API 指南:文档
每个公共模块,特型,结构,枚举,函数,方法,宏和类型定义都应具有一个示例,用于该功能的练习。
袁承兴
2020/12/10
2.1K0
Rust API 指南:文档
基于 actix、async-graphql、rbatis 构建异步 Rust GraphQL 服务(3)- 重构
首先,我们通过 shell 命令 cd ./actix-web-async-graphql-rbatis/backend 进入后端工程目录(下文中,将默认在此目录执行操作)。
niqin.com
2022/06/30
1.4K0
基于 actix、async-graphql、rbatis 构建异步 Rust GraphQL 服务(3)- 重构
rust 代码组织结构
这是 Cargo 的概念,对应一个 Cargo.toml 文件,也就是一个 rust 工程。用于构建、测试、共享 Crate。
jgrass
2024/12/25
1040
rust 代码组织结构
Rust FFI 编程 - bindgen 使用示例
当我们拥有一组具有良好声明的头文件时,自己定义 C 库的 Rust FFI 绑定函数是毫无意义的。我们可以使用 bindgen 这种工具从 C 库的头文件生成 Rust FFI 绑定函数。然后,我们运行一些测试代码以验证其是否正常运行,并对它们进行调整,直到正确为止。
MikeLoveRust
2020/09/30
2.1K0
从 RUST 库中公开 FFI
Wikipedia 将 FFI 定义为一种机制,通过这种机制,用一种编程语言编写的程序可以调用或使用用另一种编程语言编写的服务。
MikeLoveRust
2019/07/09
1.9K0
Rust FFI 编程 - Rust 语言层面对 FFI 的支持
Rust 语言对 FFI 有比较完善的支持。本节主要讲在基础设施层面,Rust 语言对 FFI 的支持。
MikeLoveRust
2020/04/20
3.3K0
听GPT 讲Rust源代码--src/tools(6)
在Rust源代码中,references.rs文件位于rust-analyzer工具的ide模块中,其作用是实现了用于搜索引用的功能。
fliter
2023/12/04
3250
听GPT 讲Rust源代码--src/tools(6)
【Rust日报】2022-05-20 - 用 Rust 扩展 SQLite
作为进程内数据库,SQLite 具有其他扩展机制,例如 用户定义函数(简称 UDF)。但是UDF有一些缺点:
MikeLoveRust
2022/06/10
7710
【Rust日报】2020-07-15 用Rust重写FORTRAN科学软件
chubaodb 是一个分布式高可用的云原生,同时支持传统的分布式文档搜索及存储系统,支持全文检索,聚合查询,向量搜索,标量搜索的功能,采用轻schema策略,尽可能提高了存储文档的灵活度。同时吸取其他类似软件的经验,初心于在有限的计算节点情况下,支持不限容量的存储及计算,同时尽可能低的学习成本,完成尽可能多的需求。
MikeLoveRust
2020/07/17
6190
【Rust日报】2024-03-26 Rust target 目录的磁盘空间问题讨论
一位 Reddit 用户在反映,在他们的 1TB 机器上,一个 target 目录占用了高达 165GB 的空间,总共有近 500GB 的 target 目录空间被占用。
MikeLoveRust
2024/04/01
3310
【Rust日报】2024-03-26 Rust target 目录的磁盘空间问题讨论
听GPT 讲Rust源代码--src/tools(33)
文件rust/src/tools/clippy/clippy_lints/src/std_instead_of_core.rs是Clippy工具中的一个lint源代码文件,用于检查在Rust程序中使用了标准库(std)而不是核心库(core)的情况。
fliter
2024/01/28
1220
听GPT 讲Rust源代码--src/tools(33)
Rust FFI 编程 - Rust导出共享库03
我们已经了解了,Rust语言是多泛式(混合泛式)的语言,它可以做命令式(过程式)编程,也可以做面向对象编程,也可以做函数式编程。把Rust简单地归类为某种泛式的编程语言,都不太合适。Rust就是Rust。
MikeLoveRust
2020/08/04
8620
听GPT 讲Rust Cargo源代码(3)
在Rust Cargo的源代码中,cargo/src/bin/cargo/commands/fix.rs文件的作用是实现了cargo fix命令。cargo fix命令用于自动修复源代码中的一些错误和不规范的代码风格,以提高代码的可读性、可维护性和性能。
fliter
2024/04/25
1540
听GPT 讲Rust Cargo源代码(3)
【译】设计优雅的 Rust 库 API
原文见:https://deterministic.space/elegant-apis-in-rust.html
MikeLoveRust
2019/11/24
1.8K0
【Rust每周一知】 Attribute 属性
Rust 中的属性数量非常多。而且具有可扩展性(可自定义属性)。Rust 的属性语法遵从 C# 定义并标准化了的属性规范ECMA-334。
MikeLoveRust
2020/03/04
4.4K0
基于 actix、async-graphql、rbatis、pgsql/mysql 构建 GraphQL 服务(4)-变更服务
前 3 篇文章中,我们初始化搭建了工程结构,选择了必须的 crate,并成功构建了 GraphQL 查询服务,以及对代码进行了第一次重构。本篇文章,是我们进行 GraphQL 服务后端开发的最后一篇:变更服务。本篇文章之后,GraphQL 服务后端开发第一阶段告一阶段,之后我们进行 基于 Rust 的 Web 前端开发。本系列文章中,采用螺旋式思路,Web 前端基础开发之后,再回头进行 GraphQL 后端开发的改进。
niqin.com
2022/06/30
1.3K0
基于 actix、async-graphql、rbatis、pgsql/mysql 构建 GraphQL 服务(4)-变更服务
初识Rust
虽然我主要使用C++,但是最近也想学点现代化的新语言。初步想的是从golang和Rust里先选一个。
owent
2018/08/01
1.6K0
第2章 | Rust 导览
安装 Rust 的最佳方式是使用 rustup。请转到 rustup.rs 网站并按照那里的说明进行操作。
草帽lufei
2024/05/08
1290
第2章 | Rust 导览
相关推荐
听GPT 讲Rust源代码--src/librustdoc
更多 >
目录
  • 一、Explain中的“Type”
    • 1.1 system
    • 1.2 const
    • 1.3 eq_ref
    • 1.4 ref
    • 1.5 range
    • 1.6 index
    • 1.7 ALL
    • 1.8总结
  • 二、Explain中的“Extra”
    • 2.1 Using where
    • 2.2 Using index
    • 2.3 Using index condition
    • 2.4 Using filesort
    • 2.5 Using temporary
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档