WsztRush

InnoDB

在用到数据库的时候,很少有人怀疑数据的一致性,更多的是怀疑性能(为此经常在数据库上面加一层缓存)。对数据库的实现比较好奇,所以最近刷了本书:

看完后之前模糊的地方清晰了一些。

为了让数据持久化下来,需要将写操作落到磁盘,这样做到数据准确比较简单,但是性能会非常差:

  1. 逻辑复杂
  2. 磁盘的随机读、写就是性能的噩梦

写内存是最快的,但一断电就悲剧了(先忽略带电池的内存),那还得写磁盘。不过现在不是去更新数据,而是顺序地记日志,只要把信息记录下来就可以恢复数据:

              +-------------+               
              |    WRITE    |               
              +------+------+               
                     |                      
       +-------------+--------------+       
       |                            |       
+------+------+              +------+------+
|    CACHE    |              |     LOG     |
+-------------+              +-------------+

断电重新开机之后,根据日志里面记录的操作再来一遍就可以把数据还原到内存,恢复完成后继续提供服务。刚才的问题解决了,但是缺点也很明显:

  1. 日志占用空间越来越大
  2. 恢复时间越来越长
  3. 内存中不可能存放所有的数据(或者恢复到磁盘上?)

后台线程在脏页太多、关机、定时触发(等)时把CACHE中的脏页刷到磁盘上,刷完之后就形成一个版本(在InnoDB中有LSN来标记版本号),该版本之前的日志已经不再需要了,这就是checkpoint技术。

总结