InnoDB内存结构
一、 Buffer Pool 主要分为3 个部分: Buffer Pool、Change Buffer、Adaptive Hash Index,另外还有一个(redo)log buffer
Buffer Pool缓存的是页面信息,包括数据页、索引页。
Change Buffer 写缓冲
如果数据库大部分索引都是非唯一索引,并且业务是写多读少,不会在写数据后立刻读取,就可以使用Change Buffer(写缓冲)。写多读少的业务,调大这个值
SHOW VARIABLES LIKE ‘innodb_change_buffer_max_size’;
代表Change Buffer 占Buffer Pool 的比例,默认25%。
Adaptive Hash Index
redo log的内容主要是用于崩盘恢复。
数据库启动时从这个文件进行恢复操作(实现crash-safe)——用它来实现事务的持久性。
磁盘结构
系统表空间 system tablespace
默认的系统表空间位置-/var/lib/mysql/ibdata1
InnoDB系统表空间包含InnoDB Data Dictionary和Doublewrite buffer,change Buffer和Undo logs。
- undo
- 数据字典:由内部系统表组成,存储表和索引的元数据(定义信息)
- 双写缓冲-InnoDB的一大特性
InnoDB页大小一般为16k,操作系统页大小4k,InnoDB的页写入到磁盘一个页需要分4次写。 - 当页的数据写入到磁盘发生了宕机,可能出现只写如了一部分,这种情况叫部分写失效(partial page write)。
解决:若这个页本身已损坏,直接redo log恢复是没意义的。所以在redo log前,需要页的副本,如果出现写入失效,就用副本来还原这个页,然后再应用redo log。这个页的副本就是double write,InnoDB的双写技术。实现了数据页的可靠性。 - 独占表空间 file-per-table tablespaces
每张表独占一个表空间。通过innodb_file_per_table 设置,默认开启。
SHOW VARIABLES LIKE ‘innodb_file_per_table’;
该文件放在/var/lib/mysql/wg_sanguo/t_hero.ibd的idb文件,存放表的索引和数据。
- 通用表空间 general tablespaces
一种共享的表空间,可以创建一个通用的表空间来存储不同数据库的表,数据路径和文件可以自定义。
create tablespace ts2673 add datafile ‘/var/lib/mysql/ts2673.ibd’ file_block_size=16K engine=innodb;
use mysql; --因为放到了mysql目录下 create table t2673(id integer)
tablespace ts2673;
- 临时表空间 temporary tablespaces
存储临时表的数据,包括用户创建的临时表,和磁盘的内部临时表。对应数据目录下的ibtmp1 文件。当数据服务器正常关闭时,该表空间被删除,下次重新产生。 - redo log
磁盘结构里的redo log - undo log tablespace
undo log(撤销日志或回滚日志)记录了事物发生之前的数据状态(不包括select)。如果修改数据时出现异常,可以用undo log来实现回滚操作(保持原子性)。
undo log和redo log统称为事务日志。
Binlog
binlog 以事件的形式记录了所有的DDL 和DML 语句(因为它记录的是操作而不是
数据值,属于逻辑日志),可以用来做主从复制和数据恢复。
- 实现数据的恢复:在开启了binlog 功能的情况下,把binlog 导出成SQL 语句,把所有的操
作重放一遍. - 实现主从复制:从服务器读取主服务器的binlog,然后执行一遍。
总结:更新流程
update user set name = ‘penyuyan’ where id=1;
- 先查询到这条数据,如果有缓存,也会用到缓存。
- 把name 改成盆鱼宴,然后调用引擎的API 接口,写入这一行数据到内存,同时记录redo log。这时redo log 进入prepare 状态,然后告诉执行器,执行完成了,可以随时提交。
- 执行器收到通知后记录binlog,然后调用存储引擎接口,设置redo log 为commit状态。
- 更新完成。
1、先记录到内存,再写日志文件。
2、记录redo log 分为两个阶段。
3、存储引擎和Server 记录不同的日志。
4、先记录redo,再记录binlog。
PS:DML(Data Manipulation Language)数据操纵语言:
适用范围:对数据库中的数据进行一些简单操作,如insert,delete,update,select等.
DDL(Data Definition Language)数据定义语言:
适用范围:对数据库中的某些对象(例如,database,table)进行管理,如Create,Alter和Drop.