从线上慢sql看explain关键字

大家好,我是烤鸭:
    最近有点忙的头晕,又懒又累,正好线上遇到慢sql的问题,就说下 MySQL Explain 关键字的解析和使用示例。

explain 关键字说明

使用explain关键字可以模拟优化器执行sql查询语句,从而得知MySQL 是如何处理sql语句。

±—±------------±------±-----------±-----±--------------±----±--------±-----±-----±---------±------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
±—±------------±------±-----------±-----±--------------±----±--------±-----±-----±---------±------+

id

select 查询的序列号,包含一组可以重复的数字,表示查询中执行sql语句的顺序。一般有三种情况:
第一种:id全部相同,sql的执行顺序是由上至下;
第二种:id全部不同,sql的执行顺序是根据id大的优先执行;
第三种:id既存在相同,又存在不同的。先根据id大的优先执行,再根据相同id从上至下的执行。

select_type

select 查询的类型,主要是用于区别普通查询,联合查询,嵌套的复杂查询
simple:简单的select 查询,查询中不包含子查询或者union
primary:查询中若包含任何复杂的子查询,最外层查询则被标记为primary
subquery:在select或where 列表中包含了子查询
dependent subquery: 子查询中的第一个SELECT语句,依赖于外部查询
uncacheable subquery: 对于该结果不能被缓存,必须重新评估外部查询的每一行子查询
derived:在from列表中包含的子查询被标记为derived(衍生)MySQL会递归执行这些子查询,把结果放在临时表里。
union:若第二个select出现在union之后,则被标记为union,若union包含在from子句的子查询中,外层select将被标记为:derived
dependent union: union 中的第二个或者后面的SELECT语句,依赖于外部查询
uncacheable union: UNION中的第二个或者后面的SELECT语句属于不可缓存子查询 (see UNCACHEABLE SUBQUERY)
union result:从union表获取结果的select

partitions

表所使用的分区,如果要统计十年公司订单的金额,可以把数据分为十个区,每一年代表一个区。这样可以大大的提高查询效率。

type

这是一个非常重要的参数,连接类型,常见的有:all , index , range , ref , eq_ref , const , system , null 八个级别。
性能从最优到最差的排序:system > const > eq_ref > ref > range > index > all
对java程序员来说,若保证查询至少达到range级别或者最好能达到ref则算是一个优秀而又负责的程序员。
all:(full table scan)全表扫描无疑是最差,若是百万千万级数据量,全表扫描会非常慢。
index:(full index scan)全索引文件扫描比all好很多,毕竟从索引树中找数据,比从全表中找数据要快。
range:只检索给定范围的行,使用索引来匹配行。范围缩小了,当然比全表扫描和全索引文件扫描要快。sql语句中一般会有between,in,>,< 等查询。
ref:非唯一性索引扫描,本质上也是一种索引访问,返回所有匹配某个单独值的行。比如查询公司所有属于研发团队的同事,匹配的结果是多个并非唯一值。
eq_ref:唯一性索引扫描,对于每个索引键,表中有一条记录与之匹配。比如查询公司的CEO,匹配的结果只可能是一条记录,
const:表示通过索引一次就可以找到,const用于比较primary key 或者unique索引。因为只匹配一行数据,所以很快,若将主键至于where列表中,MySQL就能将该查询转换为一个常量。
system:表只有一条记录(等于系统表),这是const类型的特列,平时不会出现,了解即可

possible_keys

显示查询语句可能用到的索引(一个或多个或为null),不一定被查询实际使用。仅供参考使用。

key

显示查询语句实际使用的索引。若为null,则表示没有使用索引。

key_len

显示索引中使用的字节数,可通过key_len计算查询中使用的索引长度。在不损失精确性的情况下索引长度越短越好。key_len 显示的值为索引字段的最可能长度,并非实际使用长度,即key_len是根据表定义计算而得,并不是通过表内检索出的。

ref

显示索引的哪一列或常量被用于查找索引列上的值,常见的有:const(常量),func,NULL,字段名(例:film.id)。

rows

根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数,值越大越不好。

extra

Using filesort: 说明MySQL会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序” 。出现这个就要立刻优化sql
Using temporary: 使用了临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序 order by 和 分组查询 group by。 出现这个更要立刻优化sql。
Using index: 表示相应的select 操作中使用了覆盖索引(Covering index),避免访问了表的数据行,效果不错!如果同时出现Using where,表明索引被用来执行索引键值的查找。如果没有同时出现Using where:表示索引用来读取数据而非执行查找动作。
覆盖索引(Covering Index) :也叫索引覆盖,就是select 的数据列只用从索引中就能够取得,不必读取数据行,MySQL可以利用索引返回select 列表中的字段,而不必根据索引再次读取数据文件。
Using index condition: 在5.6版本后加入的新特性,优化器会在索引存在的情况下,通过符合RANGE范围的条数 和 总数的比例来选择是使用索引还是进行全表遍历。
Using where: 表明使用了where 过滤
Using join buffer: 表明使用了连接缓存
impossible where: where 语句的值总是false,不可用,不能用来获取任何元素
distinct: 优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作。

filtered

一个百分比的值,和rows 列的值一起使用,可以估计出查询执行计划(QEP)中的前一个表的结果集,从而确定join操作的循环次数。小表驱动大表,减轻连接的次数。

常用的参数:

select_type :查询类型

type:数据读取操作的操作类型

key: 哪些索引被实际使用

ref:表之间的引用

rows: 每张表有多少行被优化器查询

extra:额外的描述,比如额外的文件排序(多一次io),使用索引,使用where条件等

线上问题sql

stage 和 video_source 是分别有索引的,但是按照这两个条件执行耗时要几秒…(一共不超过500w数据)

explain select count(1) from test_original where stage = 7 and video_source = 3;

看下执行计划几个常用参数:

type:index_merge

key:index_stage,index_video_source

rows:1042600

extra:Using intersect(index_stage,index_video_source); Using where; Using index

key和rows没什么问题,这个type和extra比较有意思了。

index_merge指的是对多个索引分别进行条件扫描,然后将它们各自的结果进行合并

extra里的Using intersect(index_stage,index_video_source)指的就是求交集。

找到问题就知道怎么优化了。把两个独立索引改成联合索引(避免两次查询后取交集)

type:ref

key:index_stage_video_source

rows:1042600

extra:Using index

可以看到建立联合索引后,只是单独的走了一次索引查询,效率更高了。

组合索引

之前对组合索引有一点误区,对最左匹配原则和组合索引的字段顺序上,下面这段也是从别的博客copy来的,分享一下。

注意最左前缀,并不是是指:一定要按照各个字段出现在where中的顺序来建立复合索引的

比如 where status=2 and roleId=xxx and number = xxx

该条件建立符合索引,我们并不需要按照status,roleId,number它们出现的顺序来建立索引:

alter table role_goods add index sin(status,roleId,number)

这是对最左前缀极大的误解。因为 where status=2 and roleId=xxx and number = xxx 和 where roleId=xxx and number = xxx and status=2它们是等价的。复合索引,哪个字段放在最前面,需要根据哪个字段经常出现在where条件中,哪个字段的选择性最好来判断的

就拿线上的那个sql来说,无论组合索引的顺序怎么建立,下面这两个是一样的。

explain select count(1) from test_original where stage = 7 and video_source = 3;
explain select count(1) from test_original where video_source = 3 and stage = 7;

但是 如果只查询其中一个条件,又想走索引,就需要考虑顺序了,只能是前面的可以走索引,这就是最左匹配。

三个字段的组合索引也一样,不需要考虑顺序,但是如果查询1-2个索引,需要遵循最左匹配原则。

查询 1 个索引的情况下,只能第一个索引生效。查询 2个索引的情况下,包含第一个索引的都会生效(无论顺序)。

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

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

相关文章

[css] style标签写在body前和body后的区别是什么?

[css] style标签写在body前和body后的区别是什么&#xff1f; 渲染机制的区别&#xff0c;在body前是已经把样式浏览一遍&#xff0c;到了对应标签直接&#xff0c;渲染样式。显示块。 在body后&#xff0c;是浏览器已经把标签浏览了&#xff0c;但基于没有样式&#xff0c;显…

自然语言处理的一些链接

Word2Vec Tutorial - The Skip-Gram ModelVisualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models With Attention) 转载于:https://www.cnblogs.com/linyihai/p/10200351.html

《Java并发编程实践-第一部分》-读书笔记

大家好&#xff0c;我是烤鸭&#xff1a; 《Java并发编程实战-第一部分》-读书笔记。 第一章&#xff1a;介绍 1.1 并发历史&#xff1a; 多个程序在各自的进程中执行&#xff0c;由系统分配资源&#xff0c;如&#xff1a;内存、文件句柄、安全证书。进程间通信方式&#x…

[css] 说说你对css盒子模型的理解

[css] 说说你对css盒子模型的理解 css盒模型由两个盒子组成&#xff0c;外在的控制是否换行的盒子&#xff0c;以及内在的控制元素内容的盒子。比如&#xff1a;display: inline-block, 则它的外在的盒子就是inline也就是不占据一行&#xff0c;而block则表示内部的元素具有块状…

go语言基础之格式化输出

1、fmt包的格式化输出输入 格式说明 格式 含义 %% 一个%字面量 %b 一个二进制整数值(基数为2)&#xff0c;或者是一个(高级的)用科学计数法表示的指数为2的浮点数 %c 字符型。可以把输入的数字按照ASCII码相应转换为对应的字符 %d 一个十进制数值(基数为10) %e 以科…

2021 年终总结

2021 年终总结 大家好&#xff0c;我是烤鸭&#xff0c;这是一篇无关技术的记录&#xff0c;总结一下这一年干了什么。 年初的目标 减肥 炒股回本 PMP拿证 多赚钱 多学习新技术 坚持写博客(一周一篇) 多看书 没达成的目标 减肥这个事&#xff0c;拖了好久&#xff0c…

[css] ::before和:after中单冒号和双冒号的区别是什么,这两个伪元素有什么作用?

[css] ::before和:after中单冒号和双冒号的区别是什么&#xff0c;这两个伪元素有什么作用&#xff1f; 区别&#xff1a;伪元素在css1中已经存在当时用单冒号&#xff0c;css3时做了修订用双冒号 ::before ::after表示伪元素用来区别伪类。作用&#xff1a;在元素前面&#x…

[css] css常用的布局方式有哪些?

[css] css常用的布局方式有哪些&#xff1f; 1&#xff1a;圣杯布局 2&#xff1a;双飞翼 3&#xff1a;flex个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

记一次线上cpu飙升100%的排查过程

大家好&#xff0c;我是烤鸭&#xff1a; 最近没怎么写技术文章&#xff0c;还是得回归下初心&#xff0c;正好前几天出现个线上问题&#xff0c;记录下排查过程。 问题描述 某个时间点&#xff0c;接收到接口响应慢报警。 过一会收到服务器cpu可用率低(<10%)报警。 去c…

[css] 对比下px、em、rem有什么不同?

[css] 对比下px、em、rem有什么不同&#xff1f; px是css中的逻辑像素&#xff0c;和移动端的物理像素之间会有一个比值dpr em是指相对于父元素的大小 rem中的r就是root&#xff0c;也就是相对于root元素的大小&#xff08;html标签&#xff09;个人简介 我是歌谣&#xff0c…

Node.js(爱前端) 一

一 Node.js 简介 1.1 官网 https://nodejs.org/en/ 官网介绍&#xff1a; Node.js是一个构建在 Chrome 浏览器V8引擎上的 JavaScript 运行环境。 Node.js 使用了事件驱动、非阻塞I/O模型&#xff0c;这些都使它轻量、好用。 Node.js 的包生态&#xff08;npm&#xff09;&#…

记一次线上服务假死排查过程

大家好&#xff0c;我是烤鸭&#xff1a; 最近线上问题有点多啊&#xff0c;分享一个服务假死的排查过程。 问题描述 9点10分&#xff0c;收到进程无响应报警(一共6台机器&#xff0c;有1台出现)&#xff0c;后来又有1台出现。 排查思路 首先确认是否误报或者网络抖动&…

[css] 简述下你理解的优雅降级和渐进增强

[css] 简述下你理解的优雅降级和渐进增强 优雅降级&#xff0c;先做好一个完善的具备完整体验的版本&#xff0c;再向下做兼容。 渐进增强&#xff0c;先做好一个可以基本正常使用的版本&#xff0c;再慢慢丰富体验和内容。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前…

vue小记

1.vue绑定属性&#xff0c;点击事件 1.<!-- 完整语法 --> <a v-bind:href"url">...</a><!-- 缩写 --> <a :href"url">...</a>2.<!-- 完整语法 --> <a v-on:click"doSomething">...</a>&l…

nacos注册中心自动上下负载

大家好&#xff0c;我是烤鸭&#xff1a; 还有2天就过年了&#xff0c;祝大家新年快乐。最近好久没写技术文章了&#xff0c;还是得回归下主业&#xff0c;今天分享下nacos注册中心自动上下负载的方式和组件。 组件版本 <properties><java.version>1.8</java.v…

[css] 清除浮动的方式有哪些及优缺点?

[css] 清除浮动的方式有哪些及优缺点&#xff1f; 什么是盒子塌陷&#xff1f; 外部盒子本应该包裹住内部的浮动盒子&#xff0c;结果却没有。问题出现的原因 父元素只包含浮动元素&#xff0c;那么它的高度就会塌缩为零&#xff08;前提就是你们没有设置高度&#xff08;heig…

windows10 C盘清理

大家好&#xff0c;我是烤鸭&#xff1a; 身为一个号称修电脑的&#xff0c;磁盘清理是必备技能了。前几天刚出的新闻 男子帮女友清理电脑C盘&#xff0c;扫出17万个文件。 想必大家都经历过清理C盘的痛苦&#xff0c;这两天正好又清了&#xff0c;分享下。 先给个结论&#…

JS代码计算股票涨停

这个纯粹是给自己留做备份用的&#xff0c;股票涨停有一个计算公式&#xff0c;但是为了自己方便查看股票涨了多少钱&#xff0c;还是决定自己写了一个 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>…

[css] 简述你对BFC规范的理解

[css] 简述你对BFC规范的理解 是CSS中的一个渲染机制&#xff0c;BFC就相当于一个盒子&#xff0c;内部的元素与外界的元素互不干扰。它不会影响外部的布局&#xff0c;外部的布局也不会影响到它。形成条件&#xff08;任意一条&#xff09;float的值不是noneposition 的值不是…

《实现领域驱动设计》读书笔记

大家好&#xff0c;我是烤鸭&#xff1a; 《实现领域驱动设计》&#xff0c;读书笔记&#xff0c;贴个封面&#xff0c;要不不知道是哪本。 了解概念 刚开始接触DDD&#xff0c;肯定懵逼&#xff0c;很多名词&#xff0c;一点点看下。 领域&#xff1a;带有业务属性的范…