能写sql 只是程序员的基本功,能写出性能优异的SQL是优秀程序员的必备技能

什么是Mysql的执行计划

要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有简单的了解。

一条SQL如何执行?大概过程

MySQL本身的功能架构分为三个部分,分别是 应用层、逻辑层、物理层,不只是MySQL ,其他大多数数据库产品都是按这种架构来进行划分的。

  • 应用层,主要负责与客户端进行交互,建立链接,记住链接状态,返回数据,响应请求,这一层是和客户端打交道的。

  • 逻辑层,主要负责查询处理、事务管理等其他数据库功能处理,以查询为例。

    • 首先接受到查询sql之后,数据库会立即分配一个线程对其进行处理;
    • 第一步查询处理器会对SQL查询进行优化,优化后会生成执行计划;
    • 然后交由计划执行器来执行。
    • 计划执行器需要访问更底层的事务管理器,存储管理器来操作数据,他们各自的分工各有不同;
    • 最终通过调用物理层的文件获取到查询结构信息,将最终结果响应给应用层。
  • 物理层,实际物理磁盘上存储的文件,主要分为数据文件,日志文件

通过上面的描述,生成执行计划是执行一条SQL必不可少的步骤,一条SQL性能的好坏,可以通过查看执行计划很直观的看出来,执行计划提供了各种查询类型与级别,方面我们进行查看以及为作为性能分析的依据。

所谓的执行计划,就是mysql如何执行一条Sql语句,包括sql查询的顺序、是否使用索引、以及使用索引信息的等等。

如何分析执行计划,来帮助我们写出更好的Sql

MySQL为我们提供了 explain 关键字来直观的查看一条SQL的执行计划。

//1. 查询table_name
select * from table_name where name="explain";//2. 查看上述语句的执行计划
explain select * from table_name where name="explain";

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

id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE table_name ALL 1 Using where

上面这个执行计划给到的信息是: 这个结果通过一个简单的语句全表扫描,共扫描1行,使用where条件在t_base_user表中筛选出的。


要想看懂执行计划,就要明白每一个参数的含义

id select_type table partitions type possible_keys key key_len ref rows Extra

id

有一组数字组成。表示一个查询中各个子查询的执行顺序;

  • id相同执行顺序由上至下。

  • id不同,id值越大优先级越高,越先被执行。

  • id为null时表示一个结果集,不需要使用它查询,常出现在包含union等查询语句中。

select_type

每个子查询的查询类型,一些常见的查询类型。

id select_type description
1 SIMPLE 不包含任何子查询或union等查询
2 PRIMARY 包含子查询最外层查询就显示为 PRIMARY
3 SUBQUERY 在select或 where字句中包含的查询
4 DERIVED from字句中包含的查询
5 UNION 出现在union后的查询语句中
6 UNION RESULT 从UNION中获取结果集,例如上文的第三个例子

table

表示该语句查询的表

partitions

表分区、表创建的时候可以指定通过那个列进行表分区。 ex:

create table tmp (id int unsigned not null AUTO_INCREMENT,name varchar(255),PRIMARY KEY (id)
) engine = innodb
partition by key (id) partitions 5;

type

访问类型

  • ALL 扫描全表数据
  • index 遍历索引
  • range 索引范围查找
  • index_subquery 在子查询中使用 ref
  • unique_subquery 在子查询中使用 eq_ref
  • ref_or_null对Null进行索引的优化的 ref
  • fulltext 使用全文索引
  • ref 使用非唯一索引查找数据
  • eq_refjoin查询中使用RIMARY KEY or UNIQUE NOT NULL索引关联。
  • const 使用主键或者唯一索引,且匹配的结果只有一条记录。
  • system const 连接类型的特例,查询的表为系统表。

possible_keys

查询涉及到的字段上若存在索引,则该索引将被列出来。当该列为 NULL时就要考虑当前的SQL是否需要优化了。可能使用的索引,注意不一定会使用。

key

显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL。

Tips:查询中若使用了覆盖索引(覆盖索引:索引的数据覆盖了需要查询的所有数据),则该索引仅出现在key列表中

key_length

索引长度 char()、varchar()索引长度的计算公式:

(Character Set:utf8mb4=4,utf8=3,gbk=2,latin1=1) * 列长度 + 1(允许null) + 2(变长列)

其他类型索引长度的计算公式: ex:

CREATE TABLE `student` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(128) NOT NULL DEFAULT '',`age` int(11),PRIMARY KEY (`id`),UNIQUE KEY `idx` (`name`),KEY `idx_age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;

name 索引长度为: 编码为utf8mb4,列长为128,不允许为NULL,字段类型为varchar(128)。key_length = 128 * 4 + 0 + 2 = 514;

age 索引长度:int类型占4位,允许null,索引长度为5。

ref

表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

rows

扫描行数,也就是说,需要扫描多少行,采能获取目标行数,一般情况下会大于返回行数。通常情况下,rows越小,效率越高,也就有大部分SQL优化,都是在减少这个值的大小。

Tips: 理想情况下扫描的行数与实际返回行数理论上是一致的,但这种情况及其少,如关联查询,扫描的行数就会比返回行数大大增加)

extra

extra的信息非常丰富,常见的有:

  • 1.Using index 使用覆盖索引
  • 2.Using where 使用了用where子句来过滤结果集
  • 3.Using filesort 使用文件排序,使用非索引列进行排序时出现,非常消耗性能,尽量优化。
  • 4.Using temporary 使用了临时表

参考blog → 彻底读懂Mysql执行计划

数据库SQL执行计划相关推荐

  1. 资源放送丨《Oracle数据库SQL执行计划的取得和解析》PPT视频

    前段时间,墨天轮邀请Oracle优化方面的资深专家 陈晓辉 老师分享了<Oracle数据库SQL执行计划的取得和解析>,在这里我们共享一下PPT和视频,供大家参考学习. Oracle优化资 ...

  2. 2场直播丨Oracle数据库SQL执行计划的取得和解析、一次特殊的 Oralce 硬解析性能问题的技术分享...

    1. Oracle数据库SQL执行计划的取得和解析- 2021.02.23 2月23日(周二)晚八点直播课,Oracle优化资深专家陈晓辉,以专业ORACLE数据库技术支持工程师的角度讲解SQL文的执 ...

  3. 一次搞定各种数据库SQL执行计划

    作者 | 董旭阳TonyDong 出品 | CSDN 博客 执行计划(execution plan,也叫查询计划或者解释计划)是数据库执行 SQL 语句的具体步骤,例如通过索引还是全表扫描访问表中的数 ...

  4. 来来来!一次搞定各种数据库 SQL 执行计划:MySQL、Oracle

    执行计划(execution plan,也叫查询计划或者解释计划)是数据库执行 SQL 语句的具体步骤,例如通过索引还是全表扫描访问表中的数据,连接查询的实现方式和连接的顺序等.如果 SQL 语句性能 ...

  5. 今晚直播丨Oracle数据库SQL执行计划的取得和解析

    2月23日(周二)晚八点直播课,Oracle优化资深专家陈晓辉,以专业ORACLE数据库技术支持工程师的角度讲解SQL文的执行过程和SQLPLAN的取得及解析方法. 分享大纲 SQL文执行过程. SQ ...

  6. 周二直播丨Oracle数据库SQL执行计划的取得和解析

    2月23日(周二)晚八点直播课,Oracle优化资深专家陈晓辉,以专业ORACLE数据库技术支持工程师的角度讲解SQL文的执行过程和SQLPLAN的取得及解析方法. 分享大纲 SQL文执行过程. SQ ...

  7. Oracle查看SQL执行计划的方式

    Oracle查看SQL执行计划的方式 获取Oracle sql执行计划并查看执行计划,是掌握和判断数据库性能的基本技巧.下面案例介绍了多种查看sql执行计划的方式: 基本有以下几种方式: 1.通过sq ...

  8. sql server varchar最大长度_来自灵魂的拷问—知道什么是SQL执行计划吗?

    面试官说:工作这么久了,应该知道sql执行计划吧,讲讲Sql的执行计划吧!看了看面试官手臂上纹的大花臂和一串看不懂的韩文,吞了吞口水,暗示自己镇定点,整理了一下思绪缓缓的对面试官说:我不会 面试官:. ...

  9. oracle执行计划走索引类型,SQL执行计划问题:where条件是主键(NUMBER类型字段)LIKE  :VAR,为什么执行计划不走索引?...

    SQL执行计划问题:where条件是主键(NUMBER类型字段)LIKE  :VAR,为什么执行计划不走索引? 中文社区 (MOSC) 数据库 (MOSC) 6 Replies Last update ...

  10. 查看SQL执行计划的方法及优劣

    作者 | 胡佳伟:云和恩墨技术工程师,有多年数据库优化经验,在一线执行过多个包括通信.保险等行业的优化项目. 在 Oracle 的性能分析中,很多时候需要对 SQL 进行分析,而最重要的就是对执行计划 ...

最新文章

  1. mac 查看mysql是否安装_[简明核心系列] 三分钟Mac安装MySQL教程
  2. 像证券交易员一样思考_2.理解绝招
  3. Unable to Open User Login File
  4. 13行满分代码:1038 统计同成绩学生 (20分)
  5. 迁移TFS 2012服务至新的电脑硬件
  6. Linux C高级编程——网络编程之UDP(4)
  7. iphone屏蔽系统更新_手贱更新了 iphone系统,想退回到原来的版本,这个方法简单易用...
  8. asp.net 获取客户端mac_Mac软件安利(人人影视 for Mac 3.1.2)
  9. [轉]asp解析json
  10. Java进阶:SpringMVC中使用fileupload报错Error creating bean with name ‘multipartResolver‘
  11. Hbase教程(一) Hbase入门教程
  12. 雷达、信号处理方向的理解
  13. 华为手机怎么隐藏按键图标_华为手机如何隐藏桌面图标
  14. ubuntu20.4 微信,qq ,等安装安装教程
  15. Burp Suite代理和火狐浏览器的设置(超详细)
  16. windows机器硬盘不能超过2T详解及图文破解方法
  17. 【Day1.4】奢华的海滨酒店,打发半天时间不成问题
  18. vue 多种方法实现名字拼接
  19. Android studio如何导入导出手机和模拟器文件
  20. 怎样查询自己正在上网的路由器的IP地址?网络节点跟踪命令tracert的用法

热门文章

  1. My BlackBerry
  2. 【5】线性反馈移位寄存器
  3. 知识图谱实现公安情报分析(人工智能系列)
  4. 计算机网络保密管理十个严禁,涉密网络保密管理规定
  5. Win7 IE8首页强制成http://www.2345.com/?uuc
  6. flash自适应屏幕 html,让Flash自适应浏览器屏幕大小的几种方法
  7. win10 联想键盘快捷键关闭_如何关闭联想台式机电脑USB键盘的FN功能
  8. java ntp授时服务器,时间同步服务器NTP
  9. 18年韩师插本c语言的题答案,插本全能题库
  10. java session 过期判断_session过期时间是多少?如何查看session是否过期?