database - WAL(write ahead log)怎么能比直接写入磁盘有更好的性能呢?
问题描述
WAL(Write-Ahead Log)技术已经在许多系统中使用。
WAL 的机制是当客户端写入数据时,系统会做两件事:
- 将日志写入磁盘并返回给客户端
- 将数据异步写入磁盘、缓存或内存
有两个好处:
- 如果发生异常(即断电),我们可以从日志中恢复数据。
- 性能好,因为我们异步写数据,可以批量操作
为什么不直接将数据写入磁盘?您将每次写入都直接写入磁盘。成功时,告诉客户端成功,如果写入失败,则返回失败响应或超时。
这样一来,你仍然有这两个好处。
- 在断电的情况下您不需要恢复任何东西。因为返回给客户端的每个成功响应都意味着数据确实在磁盘上。
- 性能应该是一样的。虽然我们经常碰磁盘,但是 WAL 也是一样的(每次 WAL 写入成功就意味着在磁盘上是成功的)
那么使用 WAL 有什么好处呢?
解决方案
表现。
列表中的第二步是可选的。对于繁忙的记录,在再次更新之前,该值可能不会从缓存中移出并进入磁盘。不需要执行这些写入,只需执行日志写入以进行可能的恢复。
日志写入可以批量写入更大的顺序写入。对于繁忙的工作负载,延迟日志写入然后执行单次写入可以显着提高吞吐量。
当旋转磁盘是标准技术时,这一点更为重要,因为寻道时间和旋转延迟有点问题。这是在读/写磁头下获取磁盘正确部分的物理过程。对于 SSD,这些考虑因素并不那么重要,但避免一些写入和大型顺序写入仍然有帮助。
更新:
SSD 在大顺序写入时也具有更好的性能,但原因不同。这不像说“没有寻道时间或旋转延迟,因此只是随机写入”那么简单。例如,将大块写入 SSD 知道是“空闲”的空间(例如,通过对驱动器的 TRIM 命令)比读取-修改-写入更好,其中驱动器还需要管理磨损均衡并可能将更新映射到不同的内部块大小。
推荐阅读
- excel - 如何切割子串?
- javascript - ReferenceError: Array is not defined Javascript
- javascript - 如何在 vuex 的 return 语句中编写 async/await
- c# - How to store C# SpecialFolder path into SQLite database?
- python - How to loop though user objects in django
- angular - Angular 在 ng build --prod 上无法识别来自键值管道的项目
- c# - How to make the placehoder in Generics generic
- python - Extract the largest number from a dataframe column containing strings
- python - 如何将参数传递给pytest测试?
- mysql - 使用mysql计算在同一列中贷记和借记的每种货币的余额?