SQL:我为什么慢你心里没数吗?

比特觅虹鹤
• 阅读 1220

SQL 语句执行慢的原因是面试中经常会被问到的,对于服务端开发来说也是必须要关注的问题。

在生产环境中,SQL 执行慢是很严重的事件。那么如何定位慢 SQL、慢的原因及如何防患于未然。接下来带着这些问题让我们开启本期之旅!

SQL:我为什么慢你心里没数吗?SQL:我为什么慢你心里没数吗?SQL:我为什么慢你心里没数吗?SQL:我为什么慢你心里没数吗?SQL:我为什么慢你心里没数吗?SQL:我为什么慢你心里没数吗?SQL:我为什么慢你心里没数吗?SQL:我为什么慢你心里没数吗?SQL:我为什么慢你心里没数吗?

这里需要重点关注以下几个字段:

1、type

表示 MySQL 在表中找到所需行的方式。其中常用的类型有:ALL、index、range、 ref、eq_ref、const、system、NULL 这些类型从左到右,性能逐渐变好。

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

2、possible_keys

查询时可能使用到的索引(但不一定会被使用,没有任何索引时显示为 NULL)。

3、key

实际使用到的索引。

4、rows

估算查找到对应的记录所需要的行数。

5、Extra

比较常见的是下面几种:

  • Useing index:表明使用了覆盖索引,无需进行回表;
  • Using where:不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤;
  • Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询,常见 group by,order by;
  • Using filesort:当Query中包含 order by 操作,而且无法利用索引完成的排序操作称为“文件排序”。

对于刷脏页的情况,我们需要控制脏页的比例,不要让它经常接近 75%。同时还要控制 redo log 的写盘速度,并且通过设置 innodb_io_capacity 参数告诉 InnoDB 你的磁盘能力。

总结

写操作

  • 当 redo log 写满时就会进行刷脏页,此时写操作也会终止,那么 SQL 执行自然就会变慢。
  • 遇到所要修改的数据行或表加了锁时,需要等待锁释放后才能进行后续操作,SQL 执行也会变慢。

读操作

  • 读操作慢很常见的原因是未命中索引从而导致全表扫描,可以通过 explain 方式对 SQL 语句进行分析。
  • 另一种原因是在读操作时,要读入的数据页不在内存中,需要通过淘汰脏页才能申请新的数据页从而导致执行变慢。

推荐阅读

为什么阿里巴巴的程序员成长速度这么快,看完他们的内部资料我懂了

字节跳动总结的设计模式 PDF 火了,完整版开放下载

刷Github时发现了一本阿里大神的算法笔记!标星70.5K

程序员50W年薪的知识体系与成长路线。

月薪在30K以下的Java程序员,可能听不懂这个项目;

字节跳动总结的设计模式 PDF 火了,完整版开放分享

关于【暴力递归算法】你所不知道的思路

开辟鸿蒙,谁做系统,聊聊华为微内核

 
=

看完三件事❤️

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。

关注公众号 『 Java斗帝 』,不定期分享原创知识。

同时可以期待后续文章ing🚀

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
sql执行计划与优化
在我们实际工作中大部分人会遇到sql优化的问题,这篇文章主要介绍SQL优化相关。首先我们怎么发现我们的sql执行效率低呢,最简单的方法就是当用户反馈慢的时候我们就会知道哪里可能会有sql效率影响的问题,这里排除其他影响情况,只考虑数据库sql慢的问题。当然这种方式对于我们来说很被动,我们还可以通过什么方式找到有性能问题sql,我们可以通过MySQL的配置文
Wesley13 Wesley13
3年前
SQL慢查询
(一)慢sql一问题发现将应用发布到生产环境后,前端页面请求后台API返回数据,发现至少需要6s。查看到慢sql:!(https://oscimg.oschina.net/oscnet/a81e2a4765114fd1a6e69d7146abe179.jpg"慢sql定位.png")慢sql定位.png
Easter79 Easter79
3年前
springboot2.x配置druid sql监控
  后端接口响应慢,通常我们就需要优化代码和sql,如果项目中使用druid连接池,那么我们可以利用其提供的sql监控功能,来帮助我们快速定位慢sql已经sql执行次数等问题,springboot2之后,durid监控配置变的更简单了,不需要额外的代码,只需要添加配置即可。整个项目配置如下:  依赖<dependency
Wesley13 Wesley13
3年前
MySQL——性能优化
性能优化的思路1、首先需要使用慢查询功能,去获取所有查询时间比较长的SQL语句。MySQL——慢查询2、其次使用explain命令去查看有问题的SQL的执行计划。MySQL——执行计划EXPLAIN3、最后可以使用showprofile\s\查看有问题的SQL的性能使用情况。MySQL高级:showprofile
Wesley13 Wesley13
3年前
Mysql 执行计划各列释义
在排查编写Mysql查询语句时,除了需要满足业务条件,还需要考虑所编写SQL的性能表现,避免出现慢SQL导致大量慢查询的情况。通常,可以通过查看执行计划的方式查看所编写SQL语句的性能优劣。此外,还可以通过查看语句的分阶段执行的时间、操作消耗来进行补充分析。1\.执行计划的列1.1.id列查询的序号1.2.s
Wesley13 Wesley13
3年前
mysql开启分析定位慢查询
捕捉mysql性能问题最常用的就是打开慢查询,定位查询效率低下的sql语句.编辑/etc/my.ini!(https://images2018.cnblogs.com/blog/1074948/201805/1074948201805311727541931899883540.png)slow_query_log慢查询开启状态
MySQL慢日志分析,资源消耗监控,执行计划
慢日志Mysql提供了慢日志记录,可以监控执行时间超过设定值的sql,并予以记录。查看是否开启了慢查询日志:sqlshowvariableslike'%slow%';sqlshowvariableslike'%longquerytime%';可以看到慢查询
慢SQL的致胜法宝 | 京东物流技术团队
大促备战,最大的隐患项之一就是慢SQL,对于服务平稳运行带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,在日常开发中如何避免出现慢SQL,出现了慢SQL应该按照什么思路去解决是我们必须要知道的。本文主要介绍对于慢SQL的排查、解决思路,通过
慢SQL原因分析之索引失效 | 京东物流技术团队
现象最近收到一个慢sql工单,慢sql大概是这样:“selectxxxfromtabelwheretype1”。咦,type字段明明有索引啊,为啥是慢sql呢?原因通过执行explain,发现实际上数据库执行了全表扫描,从而被系统判定为慢sql。这时有一定
京东云开发者 京东云开发者
5个月前
记录一次SQL慢查询优化
作者:京东物流赫占星一、慢SqL发现在一次需求UAT上线后,本来在测试环境没问题的接口,UAT环境出现了接口超时,通过查询接口日志发现是SQL查询超时了,原因是UAT环境的数据量比测试环境大得多。一般来说,我们可以通过数据库本身的慢查询日志去定位出问题的慢
比特觅虹鹤
比特觅虹鹤
Lv1
乡书不可寄,秋雁又南回。
文章
5
粉丝
0
获赞
0