SQL优化老出错,那是你没弄明白MySQL解释计划用法


Posted in MySQL onNovember 27, 2021

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

SQL优化老出错,那是你没弄明白MySQL解释计划用法

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

3、字段详解

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

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

1、id 执行的顺序

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

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

SELECT
    de.*
FROM
    dict_equip de
WHERE
    de.n_equip_id = (
        SELECT n_equip_id FROM equip e WHERE
            e.n_role_id = (
                SELECT n_role_id FROM role r WHERE r.s_name = '香菜' )
    )

SQL优化老出错,那是你没弄明白MySQL解释计划用法

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

2、select_type select 的类型

SQL优化老出错,那是你没弄明白MySQL解释计划用法

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

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

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

<derived*N*>: 衍生表

<subqueryN>: 子查询

4、partitions 查询涉及到的分区

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

5、type 查询的类型

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

SQL优化老出错,那是你没弄明白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 显示该表的索引字段关联了哪张表的哪个字段

SQL优化老出错,那是你没弄明白MySQL解释计划用法

注: 我在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子句用于限制哪一行

总结

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

到此这篇关于SQL优化老出错,那是你没弄明白MySQL解释计划用法的文章就介绍到这了,更多相关SQL优化 MySQL解释计划内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
mysql知识点整理
Apr 05 MySQL
详解MySQL的半同步
Apr 22 MySQL
MySQL之PXC集群搭建的方法步骤
May 25 MySQL
Mysql实现主从配置和多主多从配置
Jun 02 MySQL
MySQL系列之十 MySQL事务隔离实现并发控制
Jul 02 MySQL
MySQL对数据表已有表进行分区表的实现
Nov 01 MySQL
教你如何让spark sql写mysql的时候支持update操作
Feb 15 MySQL
MySQL 分区表中分区键为什么必须是主键的一部分
Mar 17 MySQL
MySQL 主从复制数据不一致的解决方法
Mar 18 MySQL
为什么MySQL8新特性会修改自增主键属性
Apr 18 MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 MySQL
面试官问我Mysql的存储引擎了解多少
Aug 05 MySQL
mysql timestamp比较查询遇到的坑及解决
Nov 27 #MySQL
分享mysql的current_timestamp小坑及解决
Nov 27 #MySQL
MySQL中CURRENT_TIMESTAMP的使用方式
Nov 27 #MySQL
MySQL Innodb索引机制详细介绍
Nov 23 #MySQL
浅谈mysql哪些情况会导致索引失效
Nov 20 #MySQL
MySQL数据库索引的最左匹配原则
Nov 20 #MySQL
mysql 联合索引生效的条件及索引失效的条件
Nov 20 #MySQL
You might like
php中根据变量的类型 选择echo或dump
2012/07/05 PHP
php 多个变量指向同一个引用($b = &amp;$a)用法分析
2019/11/13 PHP
JavaScript中Array 对象相关的几个方法
2006/12/22 Javascript
Javascript模板技术
2007/04/27 Javascript
jquery 插件学习(五)
2012/08/06 Javascript
jQuery中attr()方法用法实例
2015/01/05 Javascript
js中日期的加减法
2015/05/06 Javascript
Vue.js每天必学之计算属性computed与$watch
2016/09/05 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
Vue学习笔记进阶篇之函数化组件解析
2017/07/21 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
2017/10/20 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
2018/09/30 Javascript
基于layui框架响应式布局的一些使用详解
2019/09/16 Javascript
[07:08]2014DOTA2西雅图国际邀请赛 小组赛7月11日TOPPLAY
2014/07/11 DOTA
Django中使用group_by的方法
2015/05/26 Python
使用Python来编写HTTP服务器的超级指南
2016/02/18 Python
matplotlib中legend位置调整解析
2017/12/19 Python
python实时获取外部程序输出结果的方法
2019/01/12 Python
Pandas之ReIndex重新索引的实现
2019/06/25 Python
Django模板之基本的 for 循环 和 List内容的显示方式
2020/03/31 Python
python numpy库np.percentile用法说明
2020/06/08 Python
CSS3 完美实现圆角效果
2009/07/13 HTML / CSS
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
GetYourGuide台湾:预订旅游活动、景点和旅游项目
2019/06/10 全球购物
阿姆斯特丹城市卡:Amsterdam Pass
2019/12/01 全球购物
自我鉴定模板
2013/10/29 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
个人求职自荐信范文
2014/06/20 职场文书
设计专业毕业生求职信
2014/06/25 职场文书
2014年卫生工作总结
2014/11/27 职场文书
管理者日常工作必备:22条企业管理流程模板!
2019/07/12 职场文书
Golang Elasticsearches 批量修改查询及发送MQ
2022/04/19 Golang
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技
浅谈MySql update会锁定哪些范围的数据
2022/06/25 MySQL
react中useState使用:如何实现在当前表格直接更改数据
2022/08/05 Javascript