作者回复: 首先我们需要了解InnoDB存储引擎中缓冲池都包括了哪些,在InnoDB存储引擎中有一部分数据会放到内存中,缓冲池则占了这部分内存(In-Memory Structures)的大部分,它是用来存储各种数据的缓存,包括了数据页,索引页,插入缓冲,锁信息,自适应Hash,数据字典信息等。
为什么要使用缓冲池技术呢,这时因为InnoDB存储引擎是基于磁盘文件存储的,我们在访问物理硬盘和在内存中进行访问速度相差很大,为了尽可能弥补这中间的IO效率鸿沟,我们就需要把经常使用的数据加载到缓冲池中,避免每次访问都进行磁盘IO,从而提升数据库整体的访问性能。所以说“频次X位置”的原则,帮我们对IO访问效率进行了优化:
1)位置决定效率,提供缓冲池就是在内存中可以直接访问到数据,因此效率可以大幅提升
2)频次决定优先级顺序,因为缓冲池的大小是有限的,比如我们的磁盘有200G,但是内存只有16G,缓冲池大小只有1G,那么这时无法将所有数据都加载到缓冲池里,这里就有个优先级顺序的问题,也就是对经常使用频次高的热数据进行加载。
在了解了缓冲池作用之后,我们还需要了解缓冲池的另一个特性:预读。
因为缓冲池的作用就是提升IO效率,而我们进行读取数据的存在一个“局部性原理”,也就是我们使用了一些数据,大概率还会使用它周围的一些数据。因此我们可以采用“预读”的机制来减少未来的磁盘IO操作,进行提前加载。
我们再来看下什么是查询缓存?
查询缓存是提前把查询结果缓存起来,这样下次就不需要执行可以直接拿到结果。需要说明的是,在MySQL中的查询缓存,不是缓存查询计划,而是查询及对应的查询结果。这就意味着查询匹配的鲁棒性大大降低,只有相同的查询操作才会命中查询缓存。因此在MySQL的查询缓存命中率不高,在MySQL8.0版本中已经弃用了查询缓存功能。查看是否使用了查询缓存,使用命令:show variables like '%query_chache%';
所以说缓冲池不等于查询缓存,他们两个存在共同的特点就是都是通过缓存的机制来提升效率。而缓冲池是服务于数据库整体的IO操作,通过建立缓冲池机制来弥补存储引擎的磁盘文件与内存访问之间的效率鸿沟,同时缓冲池会采用“预读”的机器提前加载一些马上会用到的数据,以提升整体的数据库性能。而查询缓存是服务于SQL查询和查询结果集的,因为命中条件苛刻,而且只要当数据表发生了变化,查询缓存就会失效,因此命中率低,在MySQL8.0版本中已经弃用了该功能。
作者回复: 需要的时候,MySQL会自动将数据加载到缓冲池的,避免每次查询数据都进行磁盘IO,同样因为缓冲池的大小有限,因此MySQL也会管理和淘汰缓冲池,使得缓冲池性能最大化