MySQL中的 查询缓存 和Buffer Pool是一个东西吗?
MySQL中的 查询缓存 和Buffer Pool是一个东西吗?
MySQL数据库可以看作是分为了两层,server层和存储引擎层。一条sql语句进入之后会经过server层处理,然后再到存储引擎层中拿数据。
查询缓存
查询缓存位于server层的门口,也可以说它是一条sql语句进入数据库之后,第一个碰到的就是这个查询缓存 ,其中是以 key-value 的形式保存着历史查询语句对应的结果。如果此次的查询语句在缓存中有,那么就会直接返回缓存中的结果,如果没有则会将该sql语句放行到下一步。类似一个拦截器一样。
每个DML语句都会导致查询缓存清空,所以在查询和更改操作差不多的业务场景下,查询缓存反而成为了性能的瓶颈,在mysql8.0版本的时候,mysql官方已经将这个功能删除了。
Buffer Pool
Buffer Pool是存储引擎层的缓存机制,看名字也可以知道,凡是叫池(pool)的东西都是为了加速而设计的,Buffer Pool设计的初衷也是为了缓解磁盘I/O过慢的问题。会保存一部分真实数据在这个池中,如果池中没有才会去磁盘中读取。以页(page)为单位,用LRU算法更新。每次更新操作都会更新Buffer Pool中的数据,然后会有一个后台线程定期将Buffer Pool中的脏页(修改过的、与磁盘文件中的不一致的)刷新到磁盘中。
但是Buffer Pool是基于内存的,就会有断电等突发情况带来的数据丢失的风险。所以就引入了redo log以及WAL(Write-Ahead Logging)技术,每次修改都会把这个修改操作(以数据的物理形式,不是以sql的逻辑形式)记录在redo log文件中,这样每次就相当于只进行少量的磁盘I/O,大大减少了数据页磁盘I/O带来的巨额开销。并且在意外发生的时候也有恢复机制。