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

 更新时间:2021年11月25日 16:57:09   作者:香菜聊游戏  
本篇文章讲的是SQL优化老出错,那是你没弄明白MySQL解释计划用法,有兴趣的小伙伴速度来看看吧,希望本篇文章能够帮助到你

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 相同时 下面的先执行.

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

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 = '香菜' )
    )

从上面的执行计划可以看到先执行了查询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子句用于限制哪一行

总结

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

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

相关文章

  • MySQL存储引擎基础知识

    MySQL存储引擎基础知识

    本篇文章主要给大家讲述了MySQL存储引擎相关基础知识,有助于大家对MySQL存储引擎有更好的理解,学习下吧。
    2017-12-12
  • 深入理解mysql的自连接和join关联

    深入理解mysql的自连接和join关联

    这篇文章主要给大家介绍了关于mysql的自连接和join关联的相关资料,文中介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-04-04
  • windows下傻瓜式安装mysql5.7

    windows下傻瓜式安装mysql5.7

    本文给大家介绍的是简单几步轻松搞定Windows上安装Mysql5.7,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • 为什么MySQL 删除表数据 磁盘空间还一直被占用

    为什么MySQL 删除表数据 磁盘空间还一直被占用

    这篇文章主要讨论为什么MySQL 删除表数据 磁盘空间还一直被占用,项目中使用Mysql作为数据库,对于表来说,一般为表结构和表数据。表结构占用空间都是比较小的,一般都是表数据占用的空间。接下来小编就和大家一起进入下面文章内容的学习
    2021-10-10
  • mysql数据迁移到Oracle的正确方法

    mysql数据迁移到Oracle的正确方法

    这篇文章主要为大家详细介绍了mysql数据迁移到Oracle的正确方法,文中步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • 解决Mysql数据库插入数据出现问号(?)的解决办法

    解决Mysql数据库插入数据出现问号(?)的解决办法

    这篇文章主要介绍了解决Mysql数据库插入数据出现问号(?)的解决办法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • MYSQL数据库基础之Join操作原理

    MYSQL数据库基础之Join操作原理

    这篇文章主要给大家介绍了关于MYSQL数据库基础之Join操作原理的相关资料,连接(join)查询是将两个查询的结果以“横向对接”的方式合并起来的结果,需要的朋友可以参考下
    2021-07-07
  • Mysql关于数据库是否应该使用外键约束详解说明

    Mysql关于数据库是否应该使用外键约束详解说明

    MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表,外键所在的表就是从表。外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性
    2021-10-10
  • 如何安全地关闭MySQL

    如何安全地关闭MySQL

    这篇文章主要介绍了如何安全地关闭MySQL,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下
    2020-12-12
  • MySQL与MSSQl使用While语句循环生成测试数据的代码

    MySQL与MSSQl使用While语句循环生成测试数据的代码

    有时候我们测试性能的时候经常需要生产大量的测试数据,用sql语句直接生成的数据更快,需要的朋友可以参考下。
    2010-12-12

最新评论