Innodb引擎SQL执行的BufferPool缓存机制
1、先给一张图
2、大概写一下这张图的流程
1、来一条非查询语句,经过连接器、分析器、优化器,再到执行器,执行器,执行后面步骤。
2、加载根据where条件过滤出来的数据,将符合条件的整页数据都放到缓存池 buffer pool 中。
3、将 buffer pool中的数据写到 undo 日志文件中,这个文件是事务回滚时使用,Innodb引擎持有。
4、更新刚才加载到 buffer pool中的数据,根据sql更新。
5、将更新之后的数据写到 redo 日志文件中。
6、准备将redo日志写到磁盘,redo日志的作用是当服务器突然挂了,给服务器恢复数据的。
7、准备提交事务,将buffer pool中的数据复制一份写到 bin-log 日志并且写入磁盘, bin-log 日志用于用户手动恢复数据。
8、写入commit标记到redo日志中,保证redo日志和bin-log日志一致。
注意:从第七点我们可以看出,事务提交了之后,才会将数据写入到磁盘,这样是为了保证速度,不影响客户端的体验。
3、为什么Mysql不能直接更新磁盘上的数据而且设置这么一套复杂的机制来执行SQL了?
因为来一个请求就直接对磁盘文件进行随机读写,然后更新磁盘文件里的数据性能可能相当差。因为磁盘随机读写的性能是非常差的,所以直接更新磁盘文件是不能让数据库抗住很高并发的。 Mysql这套机制看起来复杂,但它可以保证每个更新请求都是更新内存BufferPool,然后顺序写日志文件,同时还能保证各种异常情况下的数据一致性。 更新内存的性能是极高的,然后顺序写磁盘上的日志文件的性能也是非常高的,要远高于随机读写磁盘文件。 正是通过这套机制,才能让我们的MySQL数据库在较高配置的机器上每秒可以抗下几干的读写请求。