谈谈MYSQL中的Explain

目录

前言

基本介绍 

Explain结果列解读

概述 

key

key_len

type

extra


前言

我们在设计一个系统的时候,有时候通常为了基础业务,写出的查询sql语句并不高效,从而影响到用户使用系统的整体体验感不是很好,我们通常在系统的测试阶段会开启MySQL中的慢日志查询的功能,可以在MySQL的系统配置文件中开启这个慢日志的功能,并且也可以设置SQL执行超过多少时间来记录到一个日志文件中,只要SQL执行的时间超过了我们设置的时间就会记录到日志文件中,我们就可以在日志文件找到执行比较慢的SQL了,从而就可以对这些语句进行调优优化,使用 Explain来分析 SQL 语句的性能。

默认情况下,MySQL 数据库没有开启慢查询日志 ,需要我们手动来设置这个参数。

如果不需要调优的话,一般 不建议启动该参数,因为开启慢查询日志会或多或少的带来一定的性能影响。慢查询日志支持将日志记录写入到文件中。

开启慢查询语句(永久生效):

#如果要永久生效,需要修改配置文件 my.cnf;
#[mysqld] 下增加或修改参数,slow_query_log 和 slow_query_log_file,重启即可,如下:#开启慢查询
slow_query_log=1
#慢查询日志存放的位置
slow_query_log_file=/home/services/mysqllog/mysql-slow.log
#规定慢 SQL 的查询阙值,超过这个值将会被记录到慢查询文件中,单位:秒
long_query_time=3
#慢查询日志以文件的形式输出
log_output=FILE

基本介绍 

Explain被称为执行计划,在语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,模拟MySQL优化器来执行SQL语句,执行查询时,会返回执行计划的信息,并不执行这条SQL。(注意,如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中)。

  • Explain结果是基于数据表中现有数据的。
  • Explain结果与MySQL版本有很大的关系,不同版本的优化器的优化策略不同。

语法:

explain sql语句

示例:

mysql> explain select * from actor;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | actor | ALL  | NULL          | NULL | NULL    | NULL |    2 | NULL  |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+

在查询中的每个”表”会输出一行,这里的“表”的意义非常广泛,不仅仅是数据库表,还可以是子查询、一个union 结果等。 

Explain结果列解读

概述 

字段解释
id每个被独立执行的操作标识,标识对象被操作的顺序,id值越大,先被执行,如果相同,执行顺序从上到下
table被操作的对象名称,通常是表名,但有其他格式
partitions匹配的分区信息(对于非分区表值为NULL)
select_type连接操作的类型
possible_keys可能用到的索引
keykey列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中
key_len被优化器选定的索引键长度,单位是字节
ref表示本行被操作对象的参照对象,无参照对象为NULL
rows查询执行所扫描的元组个数(对于innodb,此值为估计值)
type关联类型或者访问类型,也可以理解成mysql是如何决定查找表中的行,查找数据行的大概范围
extra执行计划的重要补充信息,当此列出现Using filesort , Using temporary 字样时就要小心了,很可能SQL语句需要优化

下面我们仔细的介绍下几个比较重要的列 

key

这一列显示mysql实际采用哪个索引来优化对该表的访问。 如果没有使用索引,则该列是 NULL。如果想强制mysql使用或忽视possible_keys列中的索引,在查询中使用 force index、ignore index。

key_len

这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。 举例来说,film_actor的联合索引 idx_film_actor_id 由 film_id 和 actor_id 两个int列组成,并且每个int是4字节。通 过结果中的key_len=4可推断出查询使用了第一个列:film_id列来执行索引查找。

type

对表访问方式,表示MySQL在表中找到所需行的方式,又称“访问类型”。
常用的类型有:
ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)

  • ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行
  • index: Full Index Scan,index与ALL区别为index类型只遍历索引树
  • range:只检索给定范围的行,使用一个索引来选择行
  • ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
  • eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件
  • const、system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system
  • NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。

extra

该列包含MySQL解决查询的详细信息,有以下几种情况:

  • Using where: 不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤
  • Using temporary: 表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询,常见 group by ; order by
  • Using filesort: 当Query中包含 order by 操作,而且无法利用索引完成的排序操作称为“文件排序”
  • Using join buffer: 改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。
  • Impossible where: 这个值强调了where语句会导致没有符合条件的行(通过收集统计信息不可能存在结果)。
  • Select tables optimized away: 这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行
  • No tables used: Query语句中使用from dual 或不含任何from子句

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/178261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一篇文章搞懂 JavaScript 箭头函数

一篇文章搞懂 JavaScript 箭头函数 JavaScript 箭头函数的引入为我们编写简洁且易读的代码提供了便利。 箭头函数是 ES6(ECMAScript 2015) 引入的新语法,它可以用一种更简单的方式来定义函数。本文将深入探讨箭头函数的特性、用法和一些最佳…

百度地图定位

https://lbsyun.baidu.com/index.php?titlejspopularGL/guide/geoloaction // 百度地图API功能 var map new BMap.Map(map)var point new BMap.Point(108.95, 34.27)map.centerAndZoom(point, 12)var geolocation new BMap.Geolocation()geolocation.getCurrentPosition(f…

Python常见基础数据结构

Python常见基础数据结构 字符串字符串的构造字符串是一种序列正向索引负向索引有限切片无限切片查询方法压缩方法替换方法格式化插入分割方法 列表列表构造列表同样属于序列列表的元素增加列表其他方法 元组字典字典的构造字典不属于序列字典可变 字符串 字符串的构造 • 单引…

Python神器解密:掌握property特性巧管理属性

更多资料获取 📚 个人网站:ipengtao.com property 是Python中的一个内置装饰器,它用于创建属性并允许开发者定义特定的操作,例如获取(getter)、设置(setter)和删除(dele…

【强化学习】关于PPO、SAC算法中价值函数的一些胡思乱想

最近的一些关于强化学习中价值函数的一些想法,发在了知乎上,全文考过来调公式有点麻烦,就直接发链接算了。 https://zhuanlan.zhihu.com/p/600300791?utm_psn1712895542018043904 https://zhuanlan.zhihu.com/p/667868767?utm_psn17128948…

Vue中的过滤器了解吗?过滤器的应用场景有哪些?

​🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue-filter过滤器 目录 一、是什么 二、如何用 定义filter 小结: 三、应用场景 四…

苍穹外卖项目笔记(6)— Redis操作营业状态设置

1 在 Java 中操作 Redis 1.1 Redis 的 Java 客户端 Jedis(官方推荐,且命令语句同 redis 命令)Lettuce(底层基于 Netty 多线程框架实现,性能高效)Spring Data Redis(对 Jedis 和 Lettuce 进行了…

c++ 共享内存

共享内存 一、查看所有的共享内存 (py37) hqnuc:~/tmp/hq$ ipcs -m ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00000000 4 blueberry 600 524288 2 dest 0x000000…

力扣labuladong——一刷day54

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣1660. 纠正二叉树二、力扣100. 相同的树三、力扣572. 另一棵树的子树四、力扣101. 对称二叉树 前言 判断树是否相等,就直接遍历就可以。判断…

同为科技(TOWE)模块化定制化让每条PDU实现专属供电解决方案

作为追求最高功率和空间效率的动态数据中心的理想产品,模块化、定制化PDU是追求最高功率和空间效率的动态数据中心的理想产品。同为科技(TOWE)是我国PDU行业的开创者和领导者,曾率先于中国电源分配单元http://www.pdu.com.cn网站上…

机器学习实战第3天:手写数字识别

☁️主页 Nowl 🔥专栏《机器学习实战》 《机器学习》 📑君子坐而论道,少年起而行之 ​ 文章目录 一、任务描述 二、数据集描述 三、主要代码 (1)主要代码库的说明与导入方法 (2)数据预…

2023-11-28 C语言if语句多个||或 与的时时候,会顺序执行,不满足条件则退出,不会再比较后面的内容,实例测试

一、if(i > 0 || image(0) > 5)或者if(i > 0 && image(0) > 5)&#xff0c;C语言if语句多个||或 与&&的时时候&#xff0c;会顺序执行&#xff0c;不满足条件则退出&#xff0c;不会再比较后面的内容。 二、测试代码 #include <stdio.h> #i…

题目标题:汽水瓶 c语言

1.问题描述 有这样一道智力题&#xff1a;“某商店规定&#xff1a;三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶&#xff0c;她最多可以换多少瓶汽水喝&#xff1f;”答案是5瓶&#xff0c;方法如下&#xff1a;先用9个空瓶子换3瓶汽水&#xff0c;喝掉3瓶满的&#x…

成为网络安全高手!教你如何做出专业级别的渗透测试

01、信息收集 1、域名、IP、端口 域名信息查询&#xff1a;信息可用于后续渗透 IP信息查询&#xff1a;确认域名对应IP&#xff0c;确认IP是否真实&#xff0c;确认通信是否正常 端口信息查询&#xff1a;NMap扫描&#xff0c;确认开放端口 发现&#xff1a;一共开放两…

Linux CentOS_7解决无法上网的问题

参考视频&#xff1a;保姆式教学虚拟机联网liunx(centos)_哔哩哔哩_bilibili 第一步&#xff1a;选择网络模式 第二步&#xff1a;配置网卡命令&#xff1a;打开终端执行命令&#xff1a; 1、先切换到根目录下&#xff0c;防止在第执行cd /etc/sysconfig/network-scripts命的…

java多线程-扩展知识一:进程线程、并发并行、同步异步

1、进程 进程&#xff08;Process&#xff09;是计算机中的程序关于某数据集合上的一次运行活动&#xff0c;是系统进行资源分配的基本单位&#xff0c;是操作系统结构的基础。在早期面向进程设计的计算机结构中&#xff0c;进程是程序的基本执行实体&#xff1b;在当代面向线程…

云计算——ACA学习 阿里云云计算服务概述

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 目录 写在前面 前期回顾 本期介绍 前言了解 一…

QCheckBox通过qss实现状态切换显示不同图标

QString qss "QCheckBox::indicator:unchecked{ \image:url(:/resources/status_close.png); \} \QCheckBox::indicator:checked { \image: url(:/resources/status_open.png); \}";ui->checkBox->setStyleSheet(qss);ui->checkBox->setChecked(true);

【领域驱动设计 学习目标及大纲】从CRUD到架构设计

从2018年至今&#xff0c;已工作了5年有余&#xff0c;回望这5年的工作历程&#xff0c;虽然一直在学习、一直在积累&#xff0c;但其实都在术的层面上停留&#xff0c;也就是具体的技术点。这5年多的时间里其实也不是没有窥道的想法&#xff1a; 一次是2018年刚工作的时候&am…