这是我参与「第五届青训营 」笔记创作活动的第9天
WAL 日志到底是如何保证数据的持久化,宕机后数据不丢失的?相比于其他方案,WAL 日志都有什么优势?
是的,除了 Undo Log 之外,还有其他方案可以实现 MVCC(多版本并发控制)。 一种常见的方案是使用两阶段锁定(Two-Phase Locking)。在此方案中,事务先在读阶段获得快照,然后在写阶段获得排他锁并写入最终状态。此方案的缺点是当事务的持续时间长时,会造成大量的锁冲突。 另一种方案是使用额外的版本号或时间戳字段。在此方案中,每个记录都有一个版本号或时间戳字段,该字段表示该记录的最后修改时间。当事务读取数据时,它只能读取该版本号或时间戳最新的记录。此方案的优点是可以避免锁冲突,但缺点是需要额外的存储空间来存储版本号或时间戳。 总之,选择使用哪种方案取决于特定的应用程序需求,因此需要仔细评估。
除了 Undo Log 之外,是否还有其他方案可以实现 MVCC?
WAL(Write-Ahead Logging)是一种用于数据库的持久化技术,其工作原理如下:
数据库的每次写操作先写入WAL日志,然后再写入数据页。 WAL日志记录了所有操作的日志记录,并以操作顺序记录。 当数据库出现故障时,可以通过重放WAL日志来恢复数据。 WAL日志具有如下优势:
实时恢复:WAL日志可以在数据库故障时立即恢复数据,而不需要等待长时间的数据恢复。 高效:WAL日志使用序列化写方式,可以避免多次读写数据,并且日志的缓存机制可以大大提高写入速度。 可靠:WAL日志与数据页的独立写入机制可以保证数据的持久化,并且WAL日志的多次备份机制可以保证数据的安全性。 总的来说,WAL日志是一种高效、可靠的数据持久化技术,特别适用于实时事务处理系统。
InnoDB 的 B+ Tree 是怎么实现的?
A. 相对于二叉树,层级更少,搜索效率高; B. 对于B-tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储 的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低;但当表中的数据较少时,使用B树访问数据的速度是比B+tree快的。 C. 相对Hash索引,B+tree支持范围匹配及排序操作; D.B+tree所有数据放在叶子节点上,搜索速度很平衡。