摘要:数据库的解释计划阐明了sql的执行过程,展示了执行的细节,只要根据数据库告诉我们的问题按图索骥的分析就可以。

本文分享自华为云社区《轻松搞懂mysql的执行计划,再也不怕sql优化了》,作者:香菜聊游戏。

近期要做一些sql优化的工作,虽然记得一些常用的sql 优化技巧,但是在工作中还是不够,所以需要借助工具的帮助,数据库的解释计划阐明了sql的执行过程,展示了执行的细节,我们只要根据数据库告诉我们的问题按图索骥的分析就好了,但是解释计划也不是那么容易看懂,所以今天就学习下解释计划的一些参数的意义。

1、准备工作

准备三张表,一张角色表,一张装备表,一张基础数据表,这里只展示一些教程中需要的字段,在游戏开发的过程中肯定不止这么几个字段,我想大家都懂的。

角色表:

CREATE TABLE `role` (`n_role_id` int DEFAULT NULL,`s_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

装备表:

CREATE TABLE `equip` (`n_equip_id` int DEFAULT NULL,`s_equip_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,`n_config_id` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

装备配置表

CREATE TABLE `dict_equip` (`n_equip_id` int DEFAULT NULL,`s_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

2、初识解释计划

有两种方式可以查看解释计划:

1、命令的方式:explain sql,或者 desc sql ,两个命令都可以,我觉得记住explain比较好,单词很直接。

2、借助工具 Navicat(其他的不熟,估计也有),点击查询窗口的解释,可以不用加关键字explain

可以看到结果里面包含了很多列,有的是null 有的有值,只要我们看懂了解释计划是不是就可以有的放矢的优化sql。

3、字段详解

解释计划的字段还是蛮多的,Navicat显示了12个字段,有些字段我们需要重点关注,有些知道怎么回事就好了。

官方的文档解释:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html

1、id 执行的顺序

id 是select的执行顺序,id越大优先级越高,越先被执行,id 相同时 下面的先执行.

原因是因为执行子查询时,先查内层的,再查外层

SELECTde.*
FROMdict_equip de
WHEREde.n_equip_id = (SELECT n_equip_id FROM equip e WHEREe.n_role_id = (SELECT n_role_id FROM role r WHERE r.s_name = '香菜' ))

从上面的执行计划可以看到先执行了查询role表,后执行了equip ,最后执行了 dict_equip

2、select_type select 的类型

3、table 查询涉及的表或衍生表

当前输出的正在使用的表,可以有下面几种:

<unionM,N> : 行数据是联合之后的数据id 处于 m和 n

<derived*N*>: 衍生表

<subqueryN>: 子查询

4、partitions 查询涉及到的分区

在使用分区表的时候才能用到,暂时没用到过这种高级功能。

5、type 查询的类型

表示MySQL在表中找到所需行的方式,又称“访问类型”,常见类型如下:

性能:all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const

由左至右,由最差到最好

在进行优化的时候如果查询出的数据量大的话可以使用全表扫描,避免使用索引。

如果只是查询很少的数据尽量使用索引。

6、possible_keys:预计可能使用的索引

在不和其他表进行关联的时候,查询表的是可能使用的索引

7、key:实际查询的过程中使用的索引

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

8、key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度

9、ref 显示该表的索引字段关联了哪张表的哪个字段

注: 我在equip 和 dict_equip 两张表都分别添加了索引,索引列是n_equip_id

通过上面的执行计划可以看出,首先使用了索引

10、rows:根据表统计信息及选用情况,大致估算出找到所需的记录或所需读取的行数,数值越小越好

比如 一个列上 虽然没做索引,但是都是唯一的,这个时候查找的时候如果是全表读取,就是表里有多少数据这个值就是多少,这个时候你需要优化的就是尽可能的读取少的表,可以增加索引,减少读取行数

11、filtered:返回结果的行数占读取行数的百分比,值越大越好

比如全表有100条数据,可能读取了全表数据,但是只有一条匹配上,这个时候百分比就是1,所以你需要让这个比例越大越好,也就是读到的数据尽量都是有用的,避免读取不用的数据,因为IO是很费时的。

12、extra

常见的有下面几种

use filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行,如果是这个值,应该优化索引。

use temporary:为了解决查询,MySQL需要创建一个临时表来容纳结果。典型情况如查询包含可以按不同情况列出列的GROUP BY和ORDER BY子句时。

use index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。当查询只使用作为单一索引一部分的列时,可以使用该策略

use where:where子句用于限制哪一行

4、总结

sql 优化的原则就是在保证正确的情况下缩短时间,目标是确定的,通过目标进行回推可以知道想要执行的快就要尽可能的少读数据,减少读取数据的方式大的只有两种过滤和使用索引,在这样的规则范围内进行优化,但是注意索引会占用额外的空间,要平衡好这两者的关系。

点击关注,第一时间了解华为云新鲜技术~

SQL优化老出错,那是你没弄明白MySQL解释计划相关推荐

  1. FPGA真的很难学吗?那可能是没弄明白这些道理

    问:零基础,想学FPGA,应该从哪入手?应该看什么教程?应该用什么学习板和开发板?看什么书等? 如果想速成,那就上网看视频吧,这样主要是面对应用的,一个小时内让你的板子运行起来.早期起来的快,活学活用 ...

  2. 你连原理都还没弄明白?java文档注释快捷键idea

    蚂蚁金服电话一面 第二天早上10点第一轮电话面试,我们大约聊了半个小时,关于学历工作经验这些都没有问到,对方关注的是一些基本的知识,具体记得的几个问题: Spring或者数据库的事物隔离级别和传播特性 ...

  3. 兼容超大图片的处理_N年都没弄明白!PS保存的图片格式都啥意思?

    点击蓝字 关注南哥   这个表里的格式,你都说得清么! 01 PSD 特点:支持PS全部功能,一般不用于成品图保存 后缀:.psd PSD是Photoshop的官方格式,可以自动保留下PS里的全部功能 ...

  4. Context都没弄明白凭什么拿高薪?全网最新

    前言 曾听过很多人说Android学习很简单,做个App就上手了,工作机会多,毕业后也比较容易找工作.这种观点可能是很多Android开发者最开始入行的原因之一. 在工作初期,工作主要是按照业务需求实 ...

  5. Context都没弄明白凭什么拿高薪?附小技巧

    前言 曾听过很多人说Android学习很简单,做个App就上手了,工作机会多,毕业后也比较容易找工作.这种观点可能是很多Android开发者最开始入行的原因之一. 在工作初期,工作主要是按照业务需求实 ...

  6. 云计算、大数据和人工智能还没弄明白吗(一)

    今天跟大家讲讲云计算.大数据和人工智能.为什么讲这三个东西呢?因为这三个东西现在非常火,并且它们之间好像互相有关系:一般谈云计算的时候会提到大数据.谈人工智能的时候会提大数据.谈人工智能的时候会提云计 ...

  7. 你连原理都还没弄明白?java的基本单位

    内容简介: 本书一共15章,核心内容为SpringBoot.SpringCloud.Docker.RabbitMQ消息组件.其中,SpringBoot是SpringMVC技术的延伸,使用它进行程序开发 ...

  8. java 不写this_还没弄明白Java中的this关键字吗,那来看这篇就够了!

    今天在上课时,冉冉大妹纸拉着我问:小哥哥,小哥哥,听说你在学Java,那你知道this关键字吗? 我:啊?this啊? (完了完了,学习的时候学的什么也不是,这下被问到了,还是个妹纸,答不上来岂不尴尬 ...

  9. Context都没弄明白,还怎么做Android开发?

    Activity mActivity =new Activity() 作为Android开发者,不知道你有没有思考过这个问题,Activity可以new吗?Android的应用程序开发采用JAVA语言 ...

最新文章

  1. 南京大学「自然指数」超越清华北大,位列全国高校第一、世界第七,突显学术实力...
  2. visual studio 2008 快捷键
  3. mysql后台修改表_mysql之约束以及修改数据表
  4. 修改主机名hosts
  5. prism项目搭建 wpf_Prism 源码解读1-Bootstrapper和Region的创建
  6. python cmdb_python相关cmdb系统
  7. 最长公共子序列算法 java_转【算法之动态规划(三)】动态规划算法之:最长公共子序列 最长公共子串(LCS)字符串相似度算法...
  8. Android4.4 Sensor APP--HAL代码流程
  9. 凸优化第五章对偶 5.5 最优性条件
  10. java如何开发安卓软件_Java 程序员如何快速入门 Android 开发?
  11. c语言悔棋用栈,中国象棋人机博弈程序(扁平化棋局) C语言实现
  12. 把阿拉伯数字1,2,3...转化成一,二,三
  13. wordpress文章页面添加字体增大减小链接
  14. 蓝牙传输速率详细分析【针对蓝牙4.2]
  15. 【认知计算】IBM报告解读《认知中国》— 拉近人工智能未来与现实的距离,中国企业争当认知创新者
  16. OpenCV联合Image Watch使用中关于RGB和HSV转换相关知识点
  17. icesword 是如何列出隐藏进程?
  18. 关于标签系统的一点想法。
  19. 【LeetCode】1652. 拆炸弹(C++)
  20. 大专生学Java找得到工作吗_工资如何?

热门文章

  1. 采用开源技术的好处_采用开源的6个技巧
  2. Java常见问题(1)navicat连接mysql报2059错误
  3. SVG可伸缩的矢量图形
  4. Bootstrap3 Font Awesome 字体图标旋转或翻转图标
  5. Bootstrap CSS 编码规范之属性声明顺序
  6. 数值和布尔值的解构赋值
  7. php的验证码要gd库,PHP通过GD库实现验证码功能
  8. mysql硬盘安装方法_Mysql安装教程
  9. 白盒测试方法_软件测试的种类:白盒测试和黑盒测试
  10. mysql 去重复屈居_mysql去重复关键字distinct的用法