该图是MySQL官方提供的内存结构图版本为5.7
内存结构
Buffer Pool 缓冲池
- 生产中innodb_buffer_pool_size设置大小:
- 如果mysql部署在独立服务器,建议设置为80%。反之设置为剩余内存的80%~90%
- 查看命令 show variables like ‘%innodb_buffer%’;
Change Buffer 写缓冲区
- 默认占据Buffer_pool 25% 的空间,最大支持50%,具体根据业务进行调整,如果写多读少,可以适当调大。-> innodb_change_buffer_max_size
- 查看命令:show variables like ‘%innodb_change_buffer_max_size%’;
- 设置命令:set global innodb_change_buffer_max_size = 30;
- 当更新一条数据时,该数据存在于Buffer Pool,直接在Buffer Pool修改即可,一次内存操作。如果该数据在Buffer Pool中不存在(未命中),则会直接在Change Buffer进行一次内存操作,当下次查询时,会先去磁盘读取,然后再从Change Buffer中读取数据进行合并,最终载入Buffer Pool中。
- Change Buffer,仅适用于非唯一索引页。
- 因为如果索引设置了唯一性,在进行修改时,InnoDB机制必须要做唯一性校验,也就是说必须要查询磁盘,需要做一次IO操作。此时会直接将数据查询到Buffer Pool中,然后在缓冲池修改,不会在进行Change Buffer操作。
Log Buffer 日志缓冲区
- 查询命令:
- show variables like ‘%innodb_log%’;
- 查看Log Buffer 大小和磁盘日志文件大小和个数
- 默认Log Buffer大小为16MB
- 默认磁盘单个日志文件大小为48MB,个数为 2 个
- 查看Log Buffer 大小和磁盘日志文件大小和个数
- 查询写文件和刷盘行为命令:
- show variables like ‘%innodb_flush_log%’;
- 写文件指Log Buffer向Operationing System Cache(OS Cache)中写入的过程
- 刷盘指OS Cache向磁盘中写入的过程
- innodb_flush_log_at_trx_commit
- 0:每隔1秒执行写日志文件和刷盘操作,最多丢失1秒数据
- 1:事务提交,立刻写日志和刷盘,数据不丢失,但是频繁进行IO操作(默认为 1)
- 2:事务提交,立刻写日志操作,每隔1秒进行刷盘操作
磁盘结构
System Tablespace 系统表空间
- 查看命令:show variables like ‘%innodb_data_file_path%’;
- ibdata1:12M:autoextend 指文件名:ibdata1,大小12M,自动扩充
- InnoDB Data Dictionary 数据字典
- 有内部系统表构成,存储元数据用
- Doublewrite Buffer 双写缓冲区
- 再Buffer Pool真正的写入其他表之前,先把page页中的脏页写到双写缓冲区。作用有两个,一是可以提高写入速度,二是在发生意外时可以从双写缓冲区中找回丢失数据,做到双保险。双写缓冲区默认是开启的
- 相关命令:
- 查看是否开启:show variables like ‘%innodb_doublewrite%’;
- 查看刷盘策略:show variables like ‘%innodb_flush_method%’;
- 默认值为NULL
- 在Unix系统下建议设置为 O_DIRECT 可以提高刷盘效率
- Undo Logs
- 在Undo Tablespaces中存在多个undo_0x文件,在事务开启之前,对没有被修改的原始数据做备份,用于意外情况下回滚事务用。
- Redo Log 重做日志
- 数据库宕机重启后,会将Redo Log中的数据恢复到数据库中,再根据Undo Log日志决定事务回滚还是提交,mysql是以循环的方式写入重做日志文件。重做日志文件
默认是两个文件,单个48M。
- 数据库宕机重启后,会将Redo Log中的数据恢复到数据库中,再根据Undo Log日志决定事务回滚还是提交,mysql是以循环的方式写入重做日志文件。重做日志文件
其他章节 -> 跳转
end...