这里单指innodb。
首先buffer缓冲池先加载缓存数据到bufferPool中,查询时候会从缓存看一眼有没有,没有的话从磁盘文件查,查完后会将数据缓存一份到bufferPool,并将之前的历史数据放入undo日志文件里方便以后回滚。
当sql执行器发出更新请求到存储引擎时:
- undo日志保存历史数据。
- bufferPool更新缓冲池的数据。
- 再redo log buffer里写入redo日志,防止mysql在这个更新过程中出现宕机的情况。
- 事务提交成功后,redo log buffer 的redo日志写入磁盘保存。
更新磁盘中mysql的那条语句。 此时一套完整更新流程结束。
在进行4步骤时,分为几种情况,策略配置在innodb_flush_log_at_trx_commit里
- 当配置为0时,不会吧redo的log刷入磁盘,如果mysql宕机,那就数据丢失了。
- 当配置为1时,事务一旦提交成功,就一定有一条redo log被同步到磁盘中。
- 当配置为2时,事务一旦提交成功,并不是直接写入磁盘,而是有个osCache来存入,相当于加了一层缓存,什么时候写入磁盘不一定,可能1s后。这种情况如果你的机器宕机了,那这个数据也会丢了。
查询时:
更新时:
