万字总结!springcloud分布式限流

正文

作为后端开发,日常操作数据库最常用的是写操作和读操作。读操作我们下边会讲,这个分类里我们主要来看看写操作时为什么会导致 SQL 变慢。

刷脏页

脏页的定义是这样的:内存数据页和磁盘数据页不一致时,那么称这个内存数据页为脏页。

那为什么会出现脏页,刷脏页又怎么会导致 SQL 变慢呢?那就需要我们来看看写操作时的流程是什么样的。

对于一条写操作的 SQL 来说,执行的过程中涉及到写日志,内存及同步磁盘这几种情况。

这里要提到一个日志文件,那就是 redo log,位于存储引擎层,用来存储物理日志。在写操作的时候,存储引擎(这里讨论的是 Innodb)会将记录写入到 redo log 中,并更新缓存,这样更新操作就算完成了。后续操作存储引擎会在适当的时候把操作记录同步到磁盘里。

看到这里你可能会有个疑问,redo log 不是日志文件吗,日志文件就存储在磁盘上,那写的时候岂不很慢吗?

其实,写redo log 的过程是顺序写磁盘的,磁盘顺序写减少了寻道等时间,速度比随机写要快很多( 类似Kafka存储原理),因此写 redo log 速度是很快的。

好了,让我们回到开始时候的问题,为什么会出现脏页,并且脏页为什么会使 SQL 变慢。你想想,redo log 大小是一定的,且是循环写入的。在高并发场景下,redo log 很快被写满了,但是数据来不及同步到磁盘里,这时候就会产生脏页,并且还会阻塞后续的写入操作。SQL 执行自然会变慢。

写操作时 SQL 慢的另一种情况是可能遇到了锁,这个很容易理解。举个例子,你和别人合租了一间屋子,只有一个卫生间,你们俩同时都想去,但对方比你早了一丢丢。那么此时你只能等对方出来后才能进去。

对应到 Mysql 中,当某一条 SQL 所要更改的行刚好被加了锁,那么此时只有等锁释放了后才能进行后续操作。

但是还有一种极端情况,你的室友一直占用着卫生间,那么此时你该怎么整,总不能尿裤子吧,多丢人。对应到Mysql 里就是遇到了死锁或是锁等待的情况。这时候该如何处理呢?

Mysql 中提供了查看当前锁情况的方式:

通过在命令行执行图中的语句,可以查看当前运行的事务情况,这里介绍几个查询结果中重要的参数:

当前事务如果等待时间过长或出现死锁的情况,可以通过 「kill 线程ID」 的方式释放当前的锁。

这里的线程 ID 指表中 trx_mysql_thread_id 参数。

读操作

说完了写操作,读操作大家可能相对来说更熟悉一些。SQL 慢导致读操作变慢的问题在工作中是经常会被涉及到的。

慢查询

在讲读操作变慢的原因之前我们先来看看是如何定位慢 SQL 的。Mysql 中有一个叫作慢查询日志的东西,它是用来记录超过指定时间的 SQL 语句的。默认情况下是关闭的,通过手动配置才能开启慢查询日志进行定位。

具体的配置方式是这样的:

  • 查看当前慢查询日志的开启情况:

  • 开启慢查询日志(临时):

注意这里只是临时开启了慢查询日志,如果 mysql 重启后则会失效。可以 my.cnf 中进行配置使其永久生效。

存在原因

知道了如何查看执行慢的 SQL 了,那么我们接着看读操作时为什么会导致慢查询。

(1)未命中索引

SQL 查询慢的原因之一是可能未命中索引,关于使用索引为什么能使查询变快以及使用时的注意事项,网上已经很多了,这里就不多赘述了。

(2)脏页问题

另一种还是我们上边所提到的刷脏页情况,只不过和写操作不同的是,是在读时候进行刷脏页的。

是不是有点懵逼,别急,听我娓娓道来:

为了避免每次在读写数据时访问磁盘增加 IO 开销,Innodb 存储引擎通过把相应的数据页和索引页加载到内存的缓冲池(buffer pool)中来提高读写速度。然后按照最近最少使用原则来保留缓冲池中的缓存数据。

那么当要读入的数据页不在内存中时,就需要到缓冲池中申请一个数据页,但缓冲池中数据页是一定的,当数据页达到上限时此时就需要把最久不使用的数据页从内存中淘汰掉。但如果淘汰的是脏页呢,那么就需要把脏页刷到磁盘里才能进行复用。

你看,又回到了刷脏页的情况,读操作时变慢你也能理解了吧?

防患于未然

知道了原因,我们如何来避免或缓解这种情况呢?

首先来看未命中索引的情况:

不知道大家有没有使用 Mysql 中 explain 的习惯,反正我是每次都会用它来查看下当前 SQL 命中索引的情况。避免其带来一些未知的隐患。

这里简单介绍下其使用方式,通过在所执行的 SQL 前加上 explain 就可以来分析当前 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 你的磁盘能力。

面试资料整理汇总

成功从小公司跳槽进蚂蚁定级P7,只因刷了七遍这些面试真题

成功从小公司跳槽进蚂蚁定级P7,只因刷了七遍这些面试真题

这些面试题是我朋友进阿里前狂刷七遍以上的面试资料,由于面试文档很多,内容更多,没有办法一一为大家展示出来,所以只好为大家节选出来了一部分供大家参考,需要全部文档的,关注小编后,点击这里即可免费领取。

面试的本质不是考试,而是告诉面试官你会做什么,所以,这些面试资料中提到的技术也是要学会的,不然稍微改动一下你就凉凉了

一一为大家展示出来,所以只好为大家节选出来了一部分供大家参考,需要全部文档的,关注小编后,点击这里即可免费领取。

面试的本质不是考试,而是告诉面试官你会做什么,所以,这些面试资料中提到的技术也是要学会的,不然稍微改动一下你就凉凉了

在这里祝大家能够拿到心仪的offer!

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

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

相关文章

万字长文!java读取json文件数据给对象

Java基础核心笔记总结 由于篇幅限制,我就只以截图展示目录内容以及部分笔记内容,获取完整版王者级核心宝典只需要点击点赞关注即可获取领取方式! 在这个部分我们总结了Java的基础知识,涵盖了:概述、开发环境、开发环境…

三年Java开发,java基础常问面试题

一、首先本职工作一定要做好做精 本人之前在干兼职的时候,也忽视过本职工作,从而导致自己落后平均技术水平,虽然之后迎头赶上,但这不能不算是个遗憾。前在接一些活的时候就感觉技术的重要性了,如果当年我技术再好些&a…

三年Java开发,尚学堂java马士兵全套

基于 Servlet 容器的 Web MVC 身为 Java 开发者,对于 Spring 框架并不陌生。它起源于 2002 年、Rod Johnson 著作《Expert One-on-One J2EE Design and Development》中的 Interface 21 框架,到了 2004 年,推出 Spring 1.0,从 XM…

三年经验java工资,含爱奇艺,小米,腾讯,阿里

1、PTP模型 Point-to-Point,点对点通信模型。PTP是基于队列(Queue)的,一个队列可以有多个生产者,和多个消费者。消息服务器按照收到消息的先后顺序,将消息放到队列中。队列中的每一条消息,只能由一个消费者进行消费&a…

三面美团Java岗,java多线程匿名内部类

Part 1微服务架构设计概述 1.1 传统应用架构的问题 1.2 微服务架构是什么 1.3 微服务架构有哪些特点和挑战 1.4 如何搭建微服务架构 Part 2微服务开发框架 2.1 Spring Boot 是什么 2.2 如何使用Spring Boot框架 2.3 Spring Boot生产级特性 Part 3微服务网关 3.1 Node.js 是什…

函数signal

1. 函数signal #include <signal.h> void (*signal(int sig,void (*func)(int)))(int)typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 分析&#xff1a; signal参数信号名&#xff0c;func的值是SIG_ING、SIG_DFL或接到…

三面美团Java岗,java架构师线下培训

性能优化专栏 1.Tomcat性能优化整理 2.JVM性能优化专题 3.Mysql性能优化整理 微服务架构面试专栏 1.SpringCloud面试整理 2.SpringBoot面试整理 3.Dubbo面试整理 并发编程高级面试专栏 开源框架面试题专栏 1.Spring面试整理 2.SpringMVC面试整理 3.MyBatis面试整理 分布式面…

信号 09 | SIGCLD语义

1. SIGCLD信号 SIG_DFL &#xff1a;默认的处理方式是不理会这个信号&#xff0c;但是也不会丢弃子进程状态&#xff0c;所以如果不用wait&#xff0c;waitpid对其子进行进行状态信息回收&#xff0c;会产生僵尸进程。SIG_IGN &#xff1a;忽略的处理方式&#xff0c;这个方式…

三面美团Java岗,java电子书下载百度云

Spring 全家桶&#xff1a; Spring 原理Spring面试题思维导图面试题Spring视频 Spring 原理 Spring特点Spring 核心组件Spring常用模块Spring主要包Spring常用注解Sping第三方结合Spring 10C原理Spring APO原理Spring MVC原理Spring Boot原理JPA原理Mybatis缓存Tomcat架构 Sp…

【信号】函数kill、raise、abort、alarm

一、函数kill 1. kill函数原型&#xff1a; int kill(pid_t pid, int signo); //signo:信号名分析&#xff1a; pid > 0&#xff1a; 发送信号给指定的进程pid 0&#xff1a; 发送信号给调用kill函数进程属于同一个进程组的所有进程pid < 0&#xff1a;信号signo将…

三面美团Java岗,尚学堂java马士兵全套

SpringBoot经典之作 进入Spring Boot世界 准备开发环境搭建开发工具 基础 Spring Boot基础分层开发Web应用程序响应式编程 进阶 Spring Boot进阶用ORM操作SQL数据库接口架构风格——RESTful集成安全框架&#xff0c;实现安全认证和授权集成Redis&#xff0c;实现高并发集成R…

信号 09 | 信号概念

信号的概念 信号在我们的生活随处可见&#xff0c;如&#xff1a;古代战争中摔杯为号&#xff1b;代战争中的信号弹&#xff1b;体育比赛中使用的信号枪&#xff0c;它们都有共性&#xff1a;1. 简单 2. 不能携带大量的信息 3. 满足某个特定条件才发送 信号是信息的载体&…

一招彻底帮你搞定HashMap源码,项目实战

ES 集群架构演进之路 1、初始阶段 订单中心ES初始阶段如一张白纸&#xff0c;架设方案基本没有&#xff0c;很多配置都是保持集群默认配置。整个集群部署在集团的弹性云上&#xff0c;ES集群的节点以及机器部署都比较混乱。同时按照集群维度来看&#xff0c;一个ES集群会有单…

【信号】信号集、sigprocmask、sigpending

一、信号集操作函数 内核通过读取未决信号集来判断信号是否应被处理。信号屏蔽字mask可以影响未决信号集。而我们可以在用程序自定义set来改变mask&#xff0c;来达到屏蔽指定信号目的。 sigset_t set; // typedef unsigned long sig…

一招让你拿下seata分布式事务框架,看这篇文章准没错!

第一阶段&#xff1a;架构师筑基必备技能 我觉得&#xff0c;但凡是个成年人应该都清楚扎实的基本功对自己的工作帮助有多重要。从各大招聘网站的招聘要求来看&#xff0c;第一条都明确说明需要扎实的Java基础。因此&#xff0c;一般笔试以及面试的第一轮&#xff0c;对基础的…

函数signal、sigaction

二、函数sigaction 修改信号处理动作(通常在Linux用来注册一个信号的捕捉函数) #inlcude<signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 参数&#xff1a; act&am…

一文了解OOM及解决方案,你还看不明白?

InnoDB总体结构 首先我们来看官网的一张图(图片来源于MySQL官网)&#xff1a; 从上图中可以看出其主要分为两部分结构&#xff0c;一部分为内存中的结构(上图左边)&#xff0c;一部分为磁盘中的结构(上图右边) 内存结构 InnoDB内存中的结构主要分为&#xff1a;Buffer Pool,…

信号 09 | 函数pause

函数pause 调用该函数可以造成进程主动挂起&#xff0c;等待信号唤醒&#xff0c;调用该系统调用的进程处于阻塞状态(主动放弃CPU)直到有信号递达将其唤醒。 将进程置为可中断睡眠状态。然后 它调用schedule()&#xff0c;使linux进程调度器找到另一个进程来运行。pause使调用…

一文搞懂JVM架构和运行时数据区,全网最新

1.Java基础面试知识点 Java中和equals和hashCode的区别int、char、long各占多少字节数int与integer的区别探探对Java多态的理解String、StringBuffer、StringBuilder区别什么是内部类&#xff1f;内部类的作用抽象类和接口区别抽象类的意义抽象类与接口的应用场景抽象类是否可…

一条正确的Java职业生涯规划,帮你突破瓶颈

面试题模块介绍&#xff1a; 一、Java 基础 JDK 和 JRE 有什么区别&#xff1f; 和 equals 的区别是什么&#xff1f;两个对象的 hashCode()相同&#xff0c;则 equals()也一定为 true&#xff0c;对吗&#xff1f;final 在 java 中有什么作用&#xff1f;java 中的 Math.roun…