专业书籍精读 · Database Internals · 第 7 章

日志结构存储

Database Internals · Ch 7 · Alex Petrov · 2019

EN →

这一章讲什么?

你发一条消息、点一次赞、让手表记一次心跳,这些数据最后都要落到某个数据库里。前几章讲的存法像改字典:翻到那一页,涂掉旧的,写上新的。这一章讲一种完全相反的脾气——记流水账:永远只在本子最后一行往下写,从不回头改一个字。

先打个比方

你管一家小店的账。改字典派:每个客户一页,余额变了就翻到他那页擦掉重写,查账方便,但一天要翻上千次页。流水账派:笔就没抬过,「张三 +100」「李四 −30」「张三 +50」一行行往下记,快得离谱;代价是想知道张三现在有多少钱,得从头翻一遍,看到好几条只认日期最新的那条。

旧世界为什么难

硬盘有个朴素的脾气:一路往下写,快;东一榔头西一棒子地找地方写,慢——差的不是一点,是几十上百倍。而「改字典」偏偏是后一种:改一个数字就得去它所在的那一页,那些页散落在盘的各个角落。对写得特别多的活儿(聊天记录、传感器读数、日志、点赞),这就是瓶颈。

它怎么做到的

还有个小机灵:每本册子封面贴一张速查条,能一眼告诉你「本册肯定没有张三」,省掉大量白翻。

所以该怎么选

它并没有让写变便宜,只是把「立刻付」改成了「先赊着、后台分期还」——同一条数据在整理时会被反复搬好几遍,盘上还同时躺着它的好几个版本。写多读少、写完就不太改的活儿(日志、监控指标、消息),流水账派完胜;要反复精确查、要按顺序翻一整段的,改字典派仍然更合适。

一句话记住

日志结构存储的聪明之处,就是把「回头改」换成「往后追加 + 事后归并」。写快了,但代价一分没少,只是记在「查得多翻几本」「盘上多占几份」「后台一直在整理」这三笔账上。

想进到具体机制、记号和示意图? → 切到精读版