系列综述:
目的:本系列是个人整理为了秋招面试
的,整理期间苛求每个知识点,平衡理解简易度与深入程度。
来源:材料主要源于拓跋阿秀、小林coding等大佬博客进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验自证。
结语:如果有帮到你的地方,就点个赞和关注一下呗,谢谢!!!
【C++】秋招&实习面经汇总篇
点此到文末惊喜↩︎
ACID事务模型
的数据库,采用表格形式
存储数据,通过表格中的关系连接
实现数据的查询和管理。
BASE模型
的数据库,采用多种形式
存储数据,通过分布式计算技术
实现高可扩展性、高性能和高可用性
// 短连接
连接 mysql 服务(TCP 三次握手)
执行sql
断开 mysql 服务(TCP 四次挥手)
// 长连接
连接 mysql 服务(TCP 三次握手)
执行sql
执行sql
执行sql
....
断开 mysql 服务(TCP 四次挥手)
/var/lib/mysql/ 自定义数据库名
目录下
.ibd
的结构
WHERE 查询的字段
、 GROUP BY 和 ORDER BY 作用的字段
内部结点组成的多路平衡查找树
用于快速查找
操作叶子结点组成的按主键顺序的双链表
可以进行高效的数据的增删操作
和基于范围的顺序查找
多路
表示是一棵多叉树(m>2),每个非叶子结点由两部分组成
按主键顺序的子节点索引链表
:每个子节点索引指向一个子节点,且索引结点键值等于索引子节点的最小键值(类似目录查找)。最大和最小键值
:主要用于快速定位和过滤查询请求的。平衡
表示B+树的每个子树的高度是相等的,尽可能“矮胖”查找
表示B+树的快速查找能力较强。
相比B树非叶子结点不存放数据
:可以存放更多的索引,使得树更加“矮胖”,极大减少比较耗时的I/O操作。3~4
次的磁盘 I/O 操作,即树的高度只有3~4层
。like "%value"
匹配值第一个为%,会导致全表查询Innodb 的回滚日志(undo log)
负责记录
事务执行的反向操作
undo log必须先于数据持久化到磁盘
(谋而后动),优先保证回滚日志的完整性四种隔离级别
保证事务的隔离
锁机制
保证数据的隔离
MVCC(多版本并发控制
)保证并发的访问隔离
执行中事务的修改操作
,用于事务回滚的撤销操作已提交事务的修改操作
(循环区满会被覆盖),用于短时的故障恢复所有已提交事务的修改操作
(通常来源于重做日志),用于完整的数据恢复和主从复制未提交读(read uncommitted)
提交读(read committed)
修改前先获取写锁
,并将修改保存到事务日志中,然后再提交,从而保证其他事务只能读取已经提交的事务所修改的数据。可重复读(repeatable read)
读写锁
共享访问数据,事务修改数据前要使用写锁,保证其他事务无法同时修改数据。事务读取数据前加一个读锁,保证其他事务无法修改数据串行化(serializable )
flush tables with read lock
加锁,会话结束或者执行unlock tables
会自动释放未提交事务在数据库中的修改操作
,若发生数据库崩溃
或执行ROLLBACK语句
,通过undo log将数据库恢复到事务开始前的状态。插入
记录时,存储记录的主键
,回滚时只需要删除主键对应的记录删除
记录时,存储记录的全部内容
,回滚时将该记录再插入更新
记录时,存储记录的旧值
,回滚时再更新为旧值已提交事务的所有修改操作
,当数据库发生故障时,系统会将重做日志中的操作重新执行,直到崩溃前的状态,最大限度地减少数据的丢失。写满时
将最早写入的记录刷盘并覆盖
innodb_log_Buffer_size 参数
增加redo log容量(默认16 MB)binlog_cache_size 参数
控制,超过缓存大小就要暂存到磁盘。详细解释:MySQL中数据是以页为单位,你查询一条记录,会从硬盘把一页的数据加载出来,加载出来的数据叫数据页,会放入到Buffer Pool中。后续的查询都是先从Buffer Pool中找,没有命中再去硬盘加载(page fault?),减少硬盘IO开销,提升性能。更新表数据的时候,也是如此,发现Buffer Pool里存在要更新的数据,就直接在Buffer Pool里更新。然后会把“在某个数据页上做了什么修改”记录到重做日志缓存(redo log buffer)里,接着刷盘到redo log文件里。
以页为基本单位
进行磁盘和内存的交互,一个页的默认大小为 16KB。默认配置
下为128MB
,并默认以16KB为单位大小划分缓冲页。可通过调整innodb_buffer_pool_size
参数来设置 Buffer Pool 的大小,一般建议设置成可用物理内存的 70%左右整个数据页
加载到Buffer Pool中,通过索引你定位到具体数据页,再使用页目录定位具体的数据记录先查缓存,命中再去磁盘读
)合适的时机
将脏页刷盘。空闲缓冲页的控制块的索引
的双链表脏页的控制块的索引
的双链表,后台线程就可以遍历 Flush 链表,将脏页写入到磁盘即将访问的页
移动到链表头部,如果该页不在链表中,则淘汰链表末尾页哈希表
实现单条记录
的快速查询B+树
组织索引值,实现任意数据记录
的查询
点此跳转到首行↩︎