Mysql日志和一些面试题

内存数据刷新至磁盘

在这里插入图片描述

脏页刷新机制

check point
在这里插入图片描述

page cache和buffer pool

  Page Cache(页缓存):在操作系统中,Page Cache(页缓存)是一种内存管理机制,用于缓存磁盘上的文件数据。它是操作系统对文件系统的一种优化策略,旨在提供更高效的文件访问。
  Page Cache 的主要作用是将磁盘上的文件数据缓存在内存中,以便快速响应读取和写入操作。当应用程序需要读取文件时,操作系统首先检查 Page Cache 是否已经缓存了相应的数据。如果数据已经存在于 Page Cache 中,就可以直接从内存中读取,避免了频繁的磁盘访问,提高了读取性能。类似地,对文件的写入操作也可以先写入到 Page Cache 中,然后由操作系统决定何时将数据刷入磁盘。

Page Cache(页缓存)和 Buffer Pool(缓冲池)是操作系统和数据库系统中的两个类似但有一些区别的概念。

  • 相同点:

1.内存缓存:它们都是利用内存作为缓存,将磁盘上的数据或索引页缓存到内存中,以提高读取性能。
2.数据访问优化:它们旨在减少磁盘访问次数,通过在内存中保留最常用或最近使用的数据,加快对数据的访问速度。
3.提高性能:它们都可以显著提升读取操作的性能,降低了对磁盘的依赖。

  • 不同点:

1.作用范围:Page Cache 是操作系统层面的概念,用于缓存文件系统中的文件数据。而 Buffer Pool 是数据库管理系统(如MySQL)中的概念,专门用于缓存数据库中的数据和索引页。
2.数据结构:Page Cache 以文件为单位进行缓存,将整个文件或文件的部分内容加载到内存中。而 Buffer Pool 则以页(通常是数据库页或块)为单位进行缓存,将数据库的数据和索引页按需加载到内存中。
3.管理策略:Page Cache 通常采用的是基于文件的缓存管理策略,如最近最少使用(LRU)。而 Buffer Pool 则采用数据库针对数据和索引页的管理策略,如MySQL中的InnoDB存储引擎使用的是自适应哈希索引(Adaptive Hash Index)和LRU链表结合的方式。
4.数据一致性:Buffer Pool 在数据库系统中扮演更为关键的角色,它需要处理事务的隔离和一致性要求。因此,Buffer Pool 还负责保证数据在内存中的修改和刷回磁盘的一致性,并且遵循数据库的ACID特性。
  综上所述,Page Cache 和 Buffer Pool 在某种程度上具有相似的功能,都是利用内存缓存提高读取性能。然而,Page Cache 更多地关注文件系统级别的缓存,而 Buffer Pool 则是数据库系统中专门用于缓存数据和索引页的机制,并且承担更复杂的一致性和事务管理任务。

Checkpoint和LSN

Checkpoint(检查点)和LSN(日志序列号)是数据库中常用的两个概念。

  Checkpoint 指的是在数据库运行过程中,定期将内存中的数据和脏页(已修改但未写回磁盘的数据页)写入磁盘,同时更新相关管理信息。这个过程类似于操作系统中的“崩溃恢复”,可以防止因为数据库意外关闭等异常情况导致数据丢失或不一致。Checkpoint 也可以使得数据库恢复更快,因为从磁盘加载 Checkpoint 数据比从日志中恢复更快。

  LSN(Log Sequence Number)指的是记录在数据库事务日志中的唯一标识符,用于标识日志记录中执行操作的顺序。每个写操作都会产生一个LSN,在事务提交时,系统会保证先将该事务的所有日志记录写入持久化的存储介质才返回给用户。这样,即使系统出现故障,仍然能通过恢复日志中的LSN,重新进行操作或恢复数据。

  在实际应用中,Checkpoint 和 LSN 经常一起使用。Checkpoint 可以减少恢复时间,LSN 可以确保事务提交的安全性。因此,数据库通常会周期性地执行 Checkpoint 操作,并将产生的日志记录保存到写前日志中,以保证数据一致性和崩溃恢复的高效性。

  总之,Checkpoint 和 LSN 都是数据库系统中很重要的概念,Checkpoint 用于将内存中的数据写入磁盘,防止因数据库异常关闭导致的数据丢失,LSN 则用于标识事务日志记录的顺序,确保事务的提交安全和数据一致性

Mysql的一些面试题

1.mysql内部的一个执行过程

在这里插入图片描述
  1.首先通过连接器与mysql服务器建立连接,mysql架构分server层和存储引擎层,2.(缓存查询在mysql8.0以后被废弃了,比较鸡肋),3.解析器会对sql语句进行词法分析和语法分析并建立语法树,4.通过预处理阶段(检查 SQL 查询语句中的表或者字段是否存在,将 select * 中的 * 符号,扩展为表上的所有列),5.优化器主要负责将 SQL 查询语句的执行方案确定下来,比如走那个索引,最总会生成一个执行计划,6.执行器通过执行计划调用存储引擎层的API接口。
ps:存储引擎层是一个可插拔设计,不同的存储引擎会实现一套统一的API接口供server层调用。

2.Innodb和MyISAM区别

1.Innodb支持事务,MyISAM不支持事务
2.Innodb支持外键,MyISAM不支持外键
3.Innodb支持行锁,MyISAM支持表锁(粒度大,适合读多写少的场景,如公司年度汇总表,这种用MyISAM查询起来会更快)
ps:为什么MyISAM快,两者底层的存储结构有差异,MyISAM用的是非聚簇索引,所有索引最终存储的都是记录行的地址,无需像Innodb那样回表查询。还有Innodb还需要维护一个这个MVCC的版本情况,这也会导致Innodb慢。

3.Innodb的执行细节

Inoodb的架构图
在这里插入图片描述
主要分为两块:缓存磁盘
缓存中有个Buffer Pool,我们实际修改的是Buffer Pool中的页,被修改的页成为脏页,这些脏页需要刷新到磁盘(刷脏),我们在修改前需要记录一个undo log,在修改后记录一个redo log,包括事务的提交是一个两阶段提交(prepare状态:记录redo log;commit:binlog刷盘,redo log提交修改为commit状态)

4.为什么用redo log,不用是否可以

redo log不用也可以,那就得靠脏页刷盘机制,但我们执行一些sql对数据、结构进行一些修改,这些大量的操作都是以随机I/O的方式刷入磁盘,性能会比较慢,且会造成页分裂等问题;而redo log是以一种追加的方式进行的,这是一种顺序I/O,最后刷盘只需要将redo log刷进磁盘就可以保证持久性了,这样既保证了持久性,又保证了性能。

5.如果系统突然宕机,脏页没刷入磁盘,数据该如何恢复

利用redo log来恢复,redo log有一个LSN((Log Sequence Number)指的是记录在数据库事务日志中的唯一标识符,用于标识日志记录中执行操作的顺序),redo log记录写入,版本号逐渐增加。
LSN有三个指针:1.更新指针:指向redo log buffer中,记录写入的一个最新位置;2.刷盘指针:redo log中哪些记录已经刷新到磁盘里了,刷新指针用于标记最后一次将日志数据刷新到磁盘的位置。在MySQL中,日志被写入到磁盘前可能会先存储在缓冲区中,刷新指针记录了最后一次刷新到磁盘的位置,以确保数据持久化。 3.检查点指针(check point):检查点是数据库中用于恢复和回滚的关键点,通过记录检查点指针的值,可以快速确定从哪个位置开始进行崩溃恢复或回滚操作。
系统宕机,通过查找check point的位置,将redo log中的记录加载进缓存变回脏页,达到一个恢复作用。我们再根据事务的状态决定是提交还是回滚。

6.为什么要用二阶段提交

二阶段提交是分布式事务常见的一个解决方案,数据库内部存储引擎和server层的binlog的提交也算是一种分布式事务,需要用二阶段提交保证这个一致性。redo log在prepare阶段进行刷盘,然后检查binlog是否刷盘提交,1.如过提交了,redo log也进行一个commit操作。2.如果没提交(binlog刷盘宕机了),通过redo log中的undo进行回滚。3.如果redo log在prepare阶段刷盘宕机,与binlog本身就一致。以上三点保证binlog和redolog 的一个一致性。

7.buffer pool会满,内存淘汰机制(缓存命中率低的淘汰)

buffer pool中有控制块缓存页,控制块中有一些指针串联起来的链表(空闲状态、脏页链表、lru链表)其中lru链表维护缓存里的热点数据的顺序问题,链表头部是一些热点数据,如果buffer pool满了,就从lru链表尾部移除一些没有被修改的缓存页。
ps:如果全表扫描了一次,会不会把lru链表全部换血一次?lru链表分两段,一段是热数据,一段是冷数据,一次全表扫描的数据会进入冷数据区,经过指定的时间间隔中被再次访问将会被刷进热数据区。

8.数据库调优

1.从上层来讲:双十一预售,百度搜索页的限制
2.往下:表设计,主键id自增,字段最好是非空字段
索引设计:尽量用索引覆盖,避免索引失效(模糊查询,范围查询,最左前缀等,函数计算)
3(核心).关注慢查询日志…slow.log,发现慢查询sql用explain分析一下原因,具体情况具体分析
4.再往底层:加大buffer pool,修改提交模式等

图和文字参考了
小林coding
阿斌java之路

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值