`

读懂 MySQL 执行计划

 
阅读更多

前言

 

在之前的面试过程中,问到执行计划,有很多童鞋不知道是什么?甚至将执行计划与执行时间认为是同一个概念。今天我们就一起来了解一下执行计划到底是什么?有什么用途?

 

执行计划是什么?

 

执行计划,简单的来说,是SQL在数据库中执行时的表现情况,通常用于SQL性能分析,优化等场景。在MySQL使用 explain 关键字来查看SQL的执行计划。如下所示:

 

//1. 查询t_base_user

select * from t_base_user where name="andyqian";

 

//2. 查看上述语句的执行计划

explain select * from t_base_user where name="andyqian";

 

执行查看上述2语句后,我们可以得出以下执行计划结果

 

 

上面执行计划是什么意思呢?有什么参考价值呢?

 

上面这个执行计划给到的信息是: 这个结果通过一个简单的语句全表扫描,共扫描1行,使用where条件在t_base_user表中筛选出的。发现该语句并没有走索引,为什么是这样的呢?别急,我们紧接着看下一节。

 

读懂执行计划

 

通过上面,我们知道了什么是执行计划,也看到了执行计划到底是什么东西,现在我们来具体了解一下,MySQL执行计划中,每个属性代表的是什么意思?

 

 

我们一一来介绍,并说明每个属性有哪些可选值,以及每个可选值的意思。

 

  • id
    表示查询中select操作表的顺序,按顺序从大到依次执行

  • select_type :
    该表示选择的类型,可选值有: SIMPLE(简单的),

  • type :
    该属性表示访问类型,有很多种访问类型。
    最常见的其中包括以下几种: ALL(全表扫描), index(索引扫描),range(范围扫描),ref (非唯一索引扫描),eq_ref(唯一索引扫描,),(const)常数引用, 访问速度依次由慢到快。其中 : range(范围)常见与 between and …, 大于 and 小于这种情况。
    提示 : 慢SQL是否走索引,走了什么索引,也就可以通过该属性查看了。

  • table :
    表示该语句查询的表

  • possible_keys :
    顾名思义,该属性给出了,该查询语句,可能走的索引,(如某些字段上索引的名字)这里提供的只是参考,而不是实际走的索引,也就导致会有possible_Keys不为null,key为空的现象。

  • key :
    显示MySQL实际使用的索引,其中就包括主键索引(PRIMARY),或者自建索引的名字。

  • key_len :
    表示索引所使用的字节数,

  • ref :
    连接匹配条件,如果走主键索引的话,该值为: const, 全表扫描的话,为null值

  • rows :
    扫描行数,也就是说,需要扫描多少行,采能获取目标行数,一般情况下会大于返回行数。通常情况下,rows越小,效率越高, 也就有大部分SQL优化,都是在减少这个值的大小。注意:  理想情况下扫描的行数与实际返回行数理论上是一致的,但这种情况及其少,如关联查询,扫描的行数就会比返回行数大大增加)

  • Extra
    这个属性非常重要,该属性中包括执行SQL时的真实情况信息,如上面所属,使用到的是”using where”,表示使用where筛选得到的值,常用的有:
    “Using temporary”: 使用临时表 “using filesort”: 使用文件排序

 

看到这里,我们应该已经发现,在第一步中,我们的这条SQL

 

select * from t_base_user where name="andyqian";

 

是没有走索引的,而且还是全表扫描,在数据量少的情况下,问题还不会特别突出,如果数据量比较大,这可是个会造成生产事故的慢查询哦,现在我们改造一下,将name字段添加上索引,

 

# 添加索引

alter table t_base_user add index idx_name(name);

 

看看它的执行计划是怎样的。

 

 

你看,现在已经走idx_name索引了,其type从All(全表扫描)到ref(非唯一索引了),别看就只有这一点点小区别,在大数据量的时候,可是会起大作用的哦。

 

数据结

 

本文中演示的数据结构如下:

 

# 创建表  

create table t_base_user(

oid bigint(20) not null primary key auto_increment,

name varchar(30) null comment "name",

email varchar(30) null comment "email",

age int null comment "age",

telephone varchar(30) null comment "telephone",

status tinyint(4) null comment "0  无效 1 有效",

created_at datetime null comment "",

updated_at datetime null comment ""

)

 

## 新增记录:

insert into t_base_user(name,email,age,telephone,created_at,updated_at)values("andyqian","andytohome@gmail.com",20,"15608411",now(),now());

)

 

最后

 

一个好的数据库表设计,从一开始就应该考虑添加索引,而不是到最后发现慢SQL了,影响业务了,才来补救。其实我在工作经历当中,由于新建表,或新加字段后,忘记添加索引也造成了多次生产事故,记忆犹新!!!

 

其实新建索引也是有一定的原则的,建什么索引,建在哪些字段上,这里面还有不少知识呢,下一篇文章写,尽请期待吧!

分享到:
评论

相关推荐

    MySQL SQL执行计划分析与优化方案.pptx

    读懂最简单的 SQL 是学习 MySQL 执行计划的基础。了解 SQL 语句的执行计划可以帮助我们了解数据库是如何执行查询的,并且可以根据执行计划来优化查询性能。 在 MySQL 中,可以使用 EXPLAIN 语句来查看 SQL 语句的...

    一文读懂mysql数据库

    ### 一文读懂MySQL数据库 #### 什么是数据库? 数据库是一种用于组织、存储和管理数据的电子系统或服务。它能够确保数据的安全性、可靠性和高效访问。随着信息技术的发展,数据库技术已经成为现代信息管理系统的...

    MySQL SQL执行计划分析与优化.pdf

    MySQL SQL执行计划分析与优化是数据库管理员和开发人员必备的技能之一,它涉及到如何高效地查询和操作数据。本资料由徐春阳在2019年的DTCC数据库大会上分享,主要探讨了如何理解和优化SQL查询的执行计划。 1. **读...

    MySQL hint用法解析

    我们可以对MySQL的对象(表、索引、触发器、自建函数、存储过程等)做注释(comment),这样做的目的是标识该对象的作用等以增强代码的可读性、方便其他同事快速读懂我们写的代码或某个数据库对象的作用,说白了,...

    mysql分享-explain讲解

    通过理解这些关键点,用户可以读懂mysql的查询执行计划,发现潜在的性能瓶颈,进而调整查询语句或者数据库结构,以达到优化数据库性能的目的。例如,如果发现type是ALL,并且rows值很大,这可能是性能的瓶颈所在,这...

    易语言源码MYSQL简化版管理程序.rar

    2. **易语言语法**:虽然易语言降低了编程难度,但仍然需要掌握其基本语法,比如语句结构、函数调用、变量声明等,以便于读懂源码。 3. **数据库操作**:由于是针对MySQL的管理程序,所以会涉及到数据库连接、SQL...

    PHP MySQL 图书馆管理系统前后台全部代码(附带数据库脚本).zip

    开发者需要能读懂和执行这些脚本,以确保数据库正确配置。 5. 用户认证与授权 图书馆管理系统需要处理用户登录、注册和权限控制。PHP 可以实现基于 session 或 cookie 的用户认证,通过检查用户权限来决定其能否...

    JBDC驱动(MySQL + SQl server 2005)

    它允许Java应用程序与MySQL数据库建立连接,执行SQL语句,处理结果集等。要使用它,需要在代码中加载驱动并创建Connection对象,例如: ```java Class.forName("com.mysql.jdbc.Driver"); Connection conn = ...

    关于Mybatis 中使用Mysql存储过程的方法

    2. 如果写此存储过程的人离职了,对于接手她代码的人估计是一场灾难,因为别人还要去读懂你程序逻辑,还要读懂你存储逻辑。不利于扩展。 3. 最大的缺点!虽然存储过程可以减少代码量,提高开发效率。但是有一点非常...

    一文搞懂c# await,async执行流

    然而,.Net Framework 4.5 引入了`async`和`await`关键字,使得异步编程变得更为简洁和易读。以下是使用`await`和`async`重构后的代码: ```csharp public static async Task<int> AsyncGetCount(){ using (var ...

    基于 Vue3 + TypeScript + Socket 实现的一款极简聊天应用完整源码分享给需要的同学

    介绍 PC 网页版前端:Vue3 + Vite + TypeScript + Pinia + Naive UI + Socket.io ...Mysql >= 5.7.0 (仅mysql版本需要,但执行mysql文件需要8.0以上版本) 启动项目 安装依赖 前、后端 npm install

    事物体系,看不懂你打我

    MySQL支持四种不同的事务隔离级别:Read Uncommitted(读未提交)、Read Committed(读已提交)、Repeatable Read(可重复读)和Serializable(串行化)。其中,Read Uncommitted允许脏读,Read Committed可能导致不...

    10分钟搞懂:亿级用户的分布式数据存储解决方案.docx

    【10分钟搞懂亿级用户的分布式数据存储解决方案】 在面对亿级用户的互联网服务中,传统的单体数据库往往无法承受巨大的访问压力和数据量。因此,分布式数据存储成为了解决这一问题的关键。本文将深入探讨分布式...

    ASP源码—海纳ASP网站内容管理系统 v2.0 Ultimate.zip

    在使用海纳ASP网站内容管理系统前,开发者或管理员需要具备一定的ASP编程基础,了解如何配置IIS(Internet Information Services)服务器以运行ASP应用,设置合适的数据库环境,并能读懂和修改源码以适应特定需求。...

    易语言教程 学习文件

    易语言是一种以中文编程为特色的计算机程序设计语言,它的出现旨在降低编程的门槛,使得不懂英文的用户也能方便地进行程序开发。易语言教程通常包括基础语法、数据类型、控制结构、函数与模块、界面设计等多个方面,...

    仿通达OA完整源码

    开发者需要理解工作流的概念,如流程图、审批节点、分支条件等,并能读懂源码中的工作流配置和执行逻辑。 5. 数据库设计: OA系统通常依赖于关系型数据库存储数据,如SQL Server或MySQL。源码中可能包含与数据库...

    达内cloud_note源代码

    学员需要理解这些基础知识,才能读懂代码逻辑。 2. **MVC架构**:cloud_note项目可能采用了Model-View-Controller(MVC)设计模式,这是一种常用的应用程序设计架构,用于分离业务逻辑、数据模型和用户界面。在Java...

    vc客户管理资源系统源代码下载

    7. **文档阅读与理解**: 用户需要能读懂项目文档,了解数据库结构、系统功能以及如何运行和部署程序。 8. **调试与测试**: 源代码中可能包含错误,用户需要使用VC++的调试工具进行调试,确保程序的正确运行。 9. *...

Global site tag (gtag.js) - Google Analytics