首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

原来MySQL面试还会问这些...

写redo log也是需要写磁盘的,但它的好处就是顺序IO(我们都知道顺序IO比随机IO快非常多)。 所以,redo log的存在为了:当我们修改的时候,写完内存了,但数据还没真正写到磁盘的时候。...InnoDB是有事务的,事务的四特性之一:持久性就是靠redo log来实现的(如果写入内存成功,但数据还没真正刷到磁盘,如果此时的数据库挂了,我们可以靠redo log来恢复内存的数据,这就实现了持久性...现在我们的前提是先写redo log,再写binlog,我们来看看: 如果写redo log失败了,那我们就认为这次事务问题,滚,不再写binlog。...那假设内存的数据还没来得及落磁盘,机器就挂掉了。那主从服务器的数据就不一致了。...过程: 阶段1:InnoDBredo log 写盘,InnoDB 事务进入 prepare 状态 阶段2:binlog 写盘,InooDB 事务进入 commit 状态 每个事务binlog的末尾,会记录一个

71941

MySQL 中的 DML 语句执行流程,你理解的跟我一样吗?

log 在DML语句执行的过程中,主要会涉及到两个日志——redo log和bin log,而这两个日志是数据库 WAL (Write Ahead Logging,先写日志再写磁盘提高效率) 技术的两主角...时刻A:显而易见,此时日志都没写,东西都在内存中,重启肯定会滚(就当什么事都没发生)。...时刻B:此时redo log 已经写盘,但是只是处于 prepare 状态,如果这时候发生 crash ,那么 bin log还没写 and redo log 还处于 prepare 状态,此时事务会滚...具体三种 redo log buffer占用的空间要达到 innodb_log_buffer_size一半的时候,会有后台线程主动将日志写盘。...我们可以看到 trx1 是第一个到达的,而 trx1 要进行写盘的时候已经三个事务在队列中了,所以此时 trx1 去写盘的时候带的 LSN 就会变成 200,那么此时进行写盘,就会将trx1,trx2

1.2K31
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL InnoDB 事务实现过程相关内容的概述

    7字节的滚指针(DB_ROLL_PTR)字段: 指写入滚段(ROLLBACK segment)的 UNDO LOG record (撤销日志记录记录)。...对于insert操作,将当前行的滚指针指为空,因为insert没有事务操作之前的版本。    ...(2,3两点的影响) 2,事务的提交Commit   Redo Log Buffer的写盘,由变量innodb_flush_log_at_trx_commit决定,三种模式分别是0,1,2   如果设置为...,可能是随着时候的执行(如果事务很大)逐步写盘的。...3,事务提之后   因为redo log的存在(写盘之后),事务的一致性和持久性得到了保证,对于内存中的脏数据,通过checkpoint或者内存机制刷入磁盘,在数据写入磁盘之后,redo log空间即可释放

    32210

    redis灵魂拷问:聊一聊AOF日志重写

    这样的好处是日志不会记录执行失败的命令,同时记录日志不会阻塞当前命令执行。 记录AOF是在主线程中执行的,所以也会阻塞主线程。...下面是3种写回策略的比较: 写回策略 策略说明 优点 缺点 always 执行命令同步写盘 基本不丢失命令 性能损耗 everysec 每秒写一次盘 比always性能损耗小 可能丢失1秒内命令 no...操作系统控制写盘 性能损耗最新 可能会丢失很多命令 这样,我们就需要在性能和可靠性之间做一些取舍了。...03 — AOF重写性能的影响 在上小节的介绍中,如果AOF文件较上次重写超过了100%,就要进行重写。...但是如果日志特别,AOF重写后把日志写回磁盘也是一个非常耗时的操作,那么AOF重写是否会阻塞主线程呢?

    1.3K41

    AOF日志:宕机了,Redis如何避免数据丢失?

    没错,这确实是 Redis 的一个普遍使用场景,但是,这里也有一个绝对不能忽略的问题:一旦服务器宕机,内存中的数据将全部丢失。...所以, Redis 来说,实现数据的持久化,避免从后端数据库中进行恢复,是至关重要的。目前,Redis 的持久化主要有两机制,即 AOF(Append Only File)日志和 RDB 快照。...例如,“$3 set”表示这部分 3 个字节,也就是“set”命令。但是,为了避免额外的检查开销,Redis 在向 AOF 里面记录日志的时候,并不会先去这些命令进行语法检查。...所以,Redis 使用写后日志这一方式的一好处是,可以避免出现记录错误命令的情况。除此之外,AOF 还有一个好处:它是在命令执行后才记录日志,所以不会阻塞当前的写操作。...这是因为,AOF 日志也是在主线程中执行的,如果在把日志文件写入磁盘时,磁盘写压力,就会导致写盘很慢,进而导致后续的操作也无法执行了。

    51632

    Kafka 是怎么存储的?为什么速度那么快?

    顺序写盘的速度不仅比随机写盘的速度快,而且也比随机写内存的速度快,如下图所示。...页缓存是操作系统实现的一种主要的磁盘缓存,以此用来减少磁盘 I/O 的操作。具体来说,就是把磁盘中的数据缓存到内存中,把磁盘的访问变为对内存的访问。...Linux 操作系统中的 vm.dirty_background_ratio 参数用来指定当脏页数量达到系统内存的百分之多少之后就会触发 pdflush/flush/kdmflush 等后台写进程的运行来处理脏页...脏页兴趣的读者还可以自行查阅 vm.dirty_expire_centisecs、vm.dirty_writeback.centisecs 等参数的使用说明。...此外,用过 Java 的人一般都知道两点事实:对象的内存开销非常,通常会是真实数据大小的几倍甚至更多,空间使用率低下;Java 的垃圾回收会随着堆内数据的增多而变得越来越慢。

    1.7K81

    详解Early Lock Release

    如果事务中此前的操作都是内存操作的话(在内存数据库或 LSM 结构的系统中更明显),这些 IO 的相对耗时就会显得更大。...万一 t1 在提交的过程中(flush log 等操作)失败了,导致事务滚,t2 也必须滚(可以称之为:级联滚)。...随着云计算的流行,网络盘的使用非常普遍,写盘失败的概率可以认为是相对增加了。如果把数据库存在可拔插盘上(例如移动盘),拔插移动盘也容易触发写盘失败。...如果日志文件设计成只有一个并确保总是按照 LSN 从小到的顺序写出,在 t1 的日志写盘失败的时候,t2 必定也会失败。...只不过在内存中事务已经提交了,某些系统而言,要做回滚操作可能会很复杂或难以实现。最简单的策略反而是让系统自动 crash,系统重启的时候自然会去走崩溃恢复的逻辑。

    1.5K51

    innodb存储引擎原理

    由于没有使用O_DIRECT裸写盘,所以每次写redo 必须fsync到硬盘。 另外这里还有提到的是binlog,区分的是binlog是数据库容灾的范筹(记录的是sql语句,在事务提交的时候才会写)。...undo帮助事务滚和MVCC功能。 2.1.2 表锁、行锁: 锁机制分为latch(轻量级的锁,分为mutex和rwlock。...内存的消耗在哪里?)。内存消耗在具体在缓冲区。缓冲区除了保护有数据页,索引页,还有undo页,插入缓冲。自适应hash索引、锁信息、字典信息。为什么innodb的内存会比其他的存储引擎呢?...查看innodb引擎的内存脚本:https://github.com/lumanyu/niu-command/blob/master/show_memory_usage.sh 什么是数据库实例(类似于服务器的进程...AIO:AIO的好处和坏处。

    2.6K700

    关于《秦时明月世界》运维的那些事儿—自研上云与core优化

    程序异常崩溃时候,coredump是定位BUG的利器,诸多好处,但是一种场景让业务不得不放弃它:如果程序运行时占用大量内存,异常崩溃时生成的coredump文件可能会非常非常。...而生成文件的写盘过程非常缓慢,这会严重影响系统的整体运行情况。...进了一步,但是离20s的目标还有差距。IO极限了,CPU极限了,内存有没有可能? 同步改异步,先写内存再压缩落磁盘 优化方案3: 先将core直接写到内存里: ?...但优化方案3也引入了一个新问题:这么的core直接写内存,会不会存在反复coredump,压缩转存脚本处理不过来,导致内存耗尽,从而影响整台服务器运行的可能。...xtar特别适合与CBS盘配套使用,例如发布场景:可能几千上W台机器同时解压发布包,CBS会有非常的瞬间集中压力,引入了xtar业务自身、腾讯云侧都增加一层保护。 xtar的使用方法: ?

    79930

    【 软路由 】基于koolshare固件的软路由安装

    补充知识点: 这里需要补充一点计算机网络知识点,配置软路由大有帮助: 就是在配置路由器的时候,其实就是网关的配置,因为网关有DHCP服务,所以主机的工作变得很少,连上有线或者WiFi都可以很简单的访问网络...img写盘工具:https://m0n0.ch/wall/physdiskwrite.php 写盘工具使用phydiskwrite,官网如下: 就在官网首页,下载项: 这个下载项,其实下载那个都无所谓...可以看到三个分类,注意,这个就是分类类型,如果有5个LAN口,这里也是显示3种,WAN6,WAN,LAN,只不过,LAN口的类型中会有五个迷你的插口小图标,相当于LAN口分类中,5个口。...LAN口就行(左侧勾勾),注意不要把WAN口也给选成LAN口,这俩不是一个口,一般路由器一个WAN口就可以了。...WAN口不需要配置啥物理设置之类的,如果这个软路由进行了很多配置,这时就可以选择保存并应用了。

    8.8K20

    RocketMQ分析——高并发读写

    RocketMQ高并发读写 Rocket的高并发读写的原因可以从3个方面进行分析: 生产者负载均衡 生产者发送消息负载均衡。...Broker 服务端的高并发读写主要利用Linux操作系统的PageCache特性,通过顺序写盘(Commit Log),跳跃读 来尽量命中PageCahe,从而大大减少磁盘IO。...而不是每个Topic自己独立的commitLog。...** 消息顺序写 在单台服务器上,MQ元数据都落在单个文件上(即commitLog),大量数据IO都在顺序写同一个commitLog,满1G了再写新的,真正意义上的顺序写盘。...在运行时,如果数据量非常,可以看到broker的进程占用内存比较多,其实大部分是被缓存住的commitlog。 为什么消息顺序写,消息跳跃读能够提高缓存命中率?

    2.7K40

    听原作者为你深度解读InnoDB批量建索引原理

    这样做最大的缺点就是建立索引速度慢,另外事务滚慢,系统故障恢复(crash recovery)也慢(因为redo log apply + undo)。...每个新建的索引用独立的排序缓冲区。 1.2 排序阶段:索引临时文件进行排序 如果索引的临时文件多个,则多个文进行外排序。采用的算法则是经典二路归并(two way merge sort)。...最初的实现方案就是等待系统所有脏页写盘(做一个检查点),测试中发现系统负载的时候,等待时间太长。新的优化方案则是利用观察者模式(observer)进行处理,只等待相关的脏页写盘。...当这个脏页被写入磁盘之后,则flush observer对象的remove计数器加一。索引创建完成之后,等待flush计数和remove计数相等,则所有脏页写盘完成。...2.5 其他 在对批量建索引进行设计的时候,一个不经过buffer pool的方案:直接分配页面,进行插入,单独写盘。最终因为实现稍复杂而放弃。另外对于是否写redo日志也有过讨论。

    1.5K40

    消息队列20年:腾讯专家沉淀的MQ设计精要

    如上图,我把消息队列的发展切分成了三个的阶段。...讲到这里,想必你已经主从架构了一个进一步地理解。 ? 我们先来看看消息队列的大致工作流程。...以下是一张磁盘、ssd、内存的写入性能对比图,我们可以明显地看出顺序写入的性能快于 ssd 的顺序/随机写,与内存的顺序/随机性能也相差不大,这一特性非常重要,很多组件的底层存储设计都会用到这点,理解好这点理解消息队列尤为重要...topic 数量不能过大:Kafka 的整体性能受到了 topic 数量的限制,这和底层的存储密不可分的关系,我们上文讲过,当消息来的时候,底层数据使用追加写入的方式,顺序写盘,使得整体的读写性能大大提高...如果这篇文章帮助,欢迎转发收藏! -End- 原创作者|吕昊俣 ? 消息队列的使用场景是怎样的?欢迎在腾讯云开发者公众号评论区分享。

    80941

    一个95后开发者关于消息发送的实践

    然而内存有限,无法做到整个队列的消息聚合,所以读写都是顺序的方案非常难以实现。因为在第一阶段中,写数据量超级,而在第三阶段中仅读取10%的数据,如果使用随机写必定会超时,但随机读未必会超时!...如果取空则阻塞,直到其它线程归还为止。这样可以防止因Put数据过快而导致OOM。 3. Buffer池尽可能(当前设置为4.4G)。 4....并且,使用直接IO可以让我拥有更多的内存管理权(在这内存极端有限的情况下是必须的),让写缓冲受自己所控,可以以最少的写缓冲实现更高效率的写盘。...图五 页数据通过循环缓冲区并进行写盘的过程 四、读取(get) 保存消息数据的物理页地址常驻在内存里(page_table)。...读取四个关键设计: 1. 索引表Page Table(稀疏索引)常驻内存。 2. 二分查找Page Table,得到页地址。 3.

    56800

    InnoDB表优化

    对于包含大量重复文本或者数字的表,可以考虑采用压缩的行格式存储。这样数据加载会减少缓存及I/O的需求。在使用压缩行格式前,需要考虑压缩行格式 COMPRESSED 和的不同性能影响。...避免大数据量操作插入,更新和删除之后的滚操作。如果一个的事务拖慢了服务器,那么滚将是服务器性能变得更糟。可以分批处理大数据量操作。通过杀进程方式终止的滚操作会在服务器启动时重新启动。...当 InnoDB 写满redo log时,服务器会基于一个检查点(checkpoint)就会将日志中的变更内容写到磁盘。如果redo log 文件过小,那么就会引发服务器频繁的写盘。...的日志缓存可以容纳更大的事务执行,避免不必要的写盘操作。设置变量:innodb_log_buffer_size 。...特别是对于无法完全载入缓存的表。

    1K30

    MySql InnoDB 存储引擎表优化

    4、压缩的行格式存储 对于包含大量重复文本或者数字的表,可以考虑采用压缩的行格式存储。这样数据加载会减少缓存及 I/O 的需求。...3、滚操作 避免大数据量操作插入,更新和删除之后的滚操作。如果一个的事务拖慢了服务器,那么滚将是服务器性能变得更糟。可以分批处理大数据量操作。...通过杀进程方式终止的滚操作会在服务器启动时重新启动。 可以通过如下策略减少此类问题发生: 增大缓存,避免频繁磁盘I/O。...当 InnoDB 写满 redo log 时,服务器会基于一个检查点(checkpoint)就会将日志中的变更内容写到磁盘。如果 redo log 文件过小,那么就会引发服务器频繁的写盘。...的日志缓存可以容纳更大的事务执行,避免不必要的写盘操作。设置变量:innodb_log_buffer_size 。

    36420

    redis灵魂拷问:19图+11题带你面试通关

    这些事件绑定了调函数,会调用redis的处理函数进行处理。 2 redis底层数据结构 redis5种数据类型,包括「字符串、列表、集合、有序集合和字典」。...AOF3种同步策略,如下图: ❝如果不是丢失数据特别敏感的业务,推荐使用everysec,主线程的阻塞少,故障后丢失数据只有1s。...如下图: ❝注意:如果开启了内存页,每次拷贝都需要分配2MB的内存。...6.1.2.内存页 redis默认支持内存页是2MB,使用内存页,一定程度上可以减少redis的内存分配次数,但是对数据持久化会有一定影响。...❞ 6.2操作系统限制 6.2.1.使用了swap 使用swap的原因是操作系统不能给redis分配足够大的内存,如果操作其他开启了swap,内存数据就需要不停地跟swap换入和换出,性能影响非常

    32120

    我画了 19 张图,帮你彻底搞懂 Redis

    这些事件绑定了调函数,会调用redis的处理函数进行处理。 2 redis底层数据结构 redis5种数据类型,包括字符串、列表、集合、有序集合和字典。...AOF3种同步策略,如下图: ? 如果不是丢失数据特别敏感的业务,推荐使用everysec,主线程的阻塞少,故障后丢失数据只有1s。...6.1.2.内存页 redis默认支持内存页是2MB,使用内存页,一定程度上可以减少redis的内存分配次数,但是对数据持久化会有一定影响。...6.1.6.AOF同步写盘 appendfsync策略有3种:always、everysec、no,如果采用always,每个命令都会同步写盘,这个过程是阻塞的,等写盘成功后才能处理下一条命令。...6.2操作系统限制 6.2.1.使用了swap 使用swap的原因是操作系统不能给redis分配足够大的内存,如果操作其他开启了swap,内存数据就需要不停地跟swap换入和换出,性能影响非常

    75831
    领券