WAL:Write-Ahead Logging,预写日志系统 数据库中一种高效的日志算法,对于非内存数据库而言,磁盘I/O操作是数据库效率的一大瓶颈。在相同的数据量下,采用WAL日志的数据库系统在事务提交时,磁盘写操作只有传统的回滚日志的一半左右,大大提高了数据库磁盘I/O操作的效率,从而提高了数据库的性能。 从数据库原理而言,它实现的是redo日志模式。即修改数据库时,不直接修改数据库内容,而是将修改完的数据写入日志中,并同步到磁盘上,这样对其他读进程就没有影响。如果数据库崩溃,重启后扫描日志文件,然后更新数据库。为了提高效率,WAL日志模式提供checkpoint操作,来定时进行数据更新操作。 SQLite中WAL的实现也是按照上面原理来的。在更新SQLite页时,会将更新完的页同步到磁盘上,并定时进行checkpoint操作。读数据库的时候,为了读到最新的页面,需要扫描日志文件,得到最新的数据页。为了提高扫描速度,SQLite设计了一个wal-index索引来加快对WAL日志的操作速度。具体的代码实现将慢慢写出来。