使用 WAL技术
先写日志,在写磁盘。 具体来说,当一条记录需要更新的时候,Inodb引擎就会先把记录写到 redo.log里面,并更新内存。同时,innodb引擎在适当的时候哦,将这个操作记录更新到磁盘里面。
redo.log怎么分配
Innodb的redo.log是固定大小的,比如可以配置一组4个文件,每个文件大小是1GB,那么这块粉板总共可 以记录4GB的操作。记录两个参数,write_pos和checkpoint。当write_pos追上check_point的时候那么 就会将redo.log的记录写到磁盘上。
一条update的语句执行过程
1.执行器先找引擎取出id=2的这一行。ID是主键,引擎直接用树搜索找到这一行。如果id=2这一行所在的数据页 本来就在内存中,就直接返回给执行器;否则需要从磁盘读入内存,然后在返回。 2.执行器拿到引擎给的行数据,把这个值加上1,比如原来的N,现在就是N+1,得到新的一行数据,在调用引擎接口写入这样数据。 3.引擎将这样新数据更新到内存中,同时将这个更新操作记录到redo.log里面,此时redo.log处于prepare状态。然后告知执行器执行完成了,随时可以提交事务。 4.执行器生成这个操作的bin.log并把bin.log写入磁盘。 5.执行器调用引擎的提交事务接口,引擎把刚刚写入的redo.log改成commit状态,更新完成。
redo.log参数调整
innodb_flush_log_at_trx_commit = 1每次事务的redo.log都直接持久化到磁盘。 sync_binlog=1每次事务的Binlog都持久化到磁盘