MySQL学习-缓存池

172 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

前言

上篇我们学习了MySQL中的SQL执行流程。有兴趣的小伙伴可以阅读(MySQL学习-SQL执行流程(二))。
下面我们继续学习MySQL中的数据库缓存池。

数据库缓存池

InnoDB存储引擎是以页为单位来管理存储空间的,我们进行的增删改查操作其实本质上都是在访问页面(包括读页面,写页面,创建新页面等操作)。而磁盘I/O需要消耗的时间很多,而在内存中进行操作,效率则会高很多,为了能让数据表或索引中的数据随时被我们所用,DBMS会申请占用内存来作为数据缓存池,在真正访问页面之前,需要把在磁盘上的页缓存到内存中的缓存池之后才可以访问。这样做的好处是可以让磁盘活动最小化,从而减少与磁盘直接进行I/O的时间。这种策略对提升SQL语句的查询性能来说至关重要。如果索引的数据在缓存池里,那么访问的成本会降低很多。

缓存池和查询缓存

前面学习SQL执行过程时,第二步是查询缓存,查询缓存与这里的缓存池不是一个概念。

缓存池

InnoDB存储引擎中,有一部分数据会放在内存中,缓存池则占了这部分内存的大部分,它用来存储各自数据的缓存。包括:

  • 数据页缓存
  • 插入缓存
  • 自适应索引哈希
  • 索引页
  • 锁信息
  • 数据字典信息

缓存池缓存原则

位置*频次这个原则。可以帮我们对I/O访问效率进行优化。

  • 首先,位置决定频率,提供缓存池就是为了在内存中可以直接访问数据。
  • 其次,频次决定优先级顺序。因为缓存池大小是有限的,无法将所有数据都加载到缓存池里,这时就涉及到优先级顺序,会优先对使用频次高的热数据进行加载。

缓存池的预读特性

为了减少磁盘I/O,InnoDB通过在缓存池中提前读取多个数据页来进行优化,这种方式叫作预读。

查询缓存

查询缓存是提前把查询结果缓存起来,这样下次不需要执行就可以直接拿到结果。需要说明的是,在MySQL中的查询缓存,不是缓存查询计划,而是查询对应的结果。因为命中条件非常苛刻,而且只要数据表发生变化,查询缓存就会失效,因此命中率低。

缓存池如何读取数据

缓存池管理器会尽量将经常使用的数据保存起来,在数据库进行页面读操作的时候,首先会判断该页面是否在缓存池中,如果存在就直接读取,如果不存在,就会通过内存或磁盘将页面存放到缓存池中再进行读取。

查看/设置缓存池大小

如果使用的是InnoDB存储引擎,可以通过查看innodb_buffer_pool_size变量来查看缓存池的大小,语法如下:

show variables like 'innodb_buffer_pool_size';
set global innodb_buffer_pool_size = 104857600;
或者
[server]
innodb_buffer_pool_size = 104857600

今天先学习到这里,明天继续。