引入
- 比如,数据A中有个B表,B表中有一条数据的phone为1XXX,需要对这个手机号频繁的修改,那么这个过程会频繁涉及到内存和磁盘的交互,因为磁盘的读取太慢,为了提升性能,就可以在内存和磁盘之间添加一个缓存,把原本的内存和磁盘的交互,转变成让缓存和磁盘做后续的操作,以达到提升效率的效果。
对于数据如何和磁盘交互,什么时候同步到磁盘需要注意下,
- 因为缓存一般是基于内存的,对于内存而言一旦宕机,内存中的数据就没有了,需要注意如何把脏页数据同步到磁盘,对于这个同步的过程可以称为‘刷脏’。
- 在mysql中,后台会有几个现场,在某些固定时间间隔/缓存满了/某个日志满了时进行一次刷脏。
- 脏页:没有来得及同步到磁盘的数据。
- 刷脏:将没有来得及同步到磁盘的数据同步到磁盘的过程。
简单举例
buffer pool
对于mysql来说,数据是存储在磁盘上的,除了MEMORY引擎,因为如果每次查询/修改都直接和磁盘交互的话,性能是很差的,为了提升读写性能,Innodb引入了中间层buffer pool
。
作用
buffer pool的作用:缓存表数据和索引数据,把磁盘上的数据加载到缓冲池,避免每次都进行磁盘IO,从而提升访问速度,也可以认为是缓存页数据的,对于每个页数据大小为16KB。
- 页数据:页innodb的存储单元,采用了一种预读思想,无论是在磁盘、还是buffer pool中,都是按页进行读取的。
有了buffer pool之后的查询
- 会先检查buffer pool是否存在该数据
- 如果存在,直接从buffer pool中获取,避免频繁磁盘读取,从而提升性能;如果不存在再去从磁盘去读取,取到之后,会把数据所在的页复制一份到buffer pool,并返回给客户端。
- 后续,再次读取可以从buffer pool中就近读取。
对于修改操作类似。
buffer pool 配置
- 因为buffer pool是基于内存的,那么对应的空间是不可能无限大的。
windows版本默认大小为8M
linux版本默认大小为128M
- 可以通过修改配置文件中的
innodb_buffer_pool_size
参数来修改buffer pool的整个大小
-- 查看buffer pool
show variables like 'innodb_buffer_pool_size';
-- 修改buffer pool
set global innodb_buffer_pool_size=16M
注意:对于buffer pool的大小来说,如果有台4c8g的服务器用于数据库使用,那么在很多情况下,为了优化性能,会将整个buffer pool的大小设置占比为整个服务的60%-80%。
buffer pool满了怎么处理
- 可以认为是内存满了,如果内存满了,会怎么处理?当然是触发内存淘汰策略,对于buffer pool而言同样如此,使用特殊的LRU(最近最少使用)内存淘汰策略。
对于内存淘汰策略,我将会更新在下一个文章