理解mysql_事务原理及常见优化思路

WAL机制, 先采用日志的方式将操作记录下来,然后刷新磁盘。
InnoDB遵循WAL协议,在日志持久化到磁盘之后,才会将日志对应的脏页刷 回磁盘;

InnoDB内存中,DML操作顺序如下:
– 写Undo(获取ROLLBACK_PTR系统列)
– 修改Page
– 写Redo的顺序

不同的Update语句,写的日志量有较大差异(三种Update Case);
– In Place Update日志量最小,操作最简单;
– 不修改主键列,日志量其次;
– 修改主键列,日志量最大,操作最复杂;


日志文件:
redo:保证事务的持久性
顺序写,基本上不用读操作,只有在异常down机后才会读进行数据恢复操作。
何时写: 事务提交时
当log buffer中有一半的内存空间已经被使用时
log checkpoint时
实例shutdown时
binlog切换时
undo:
保证事务的原子性
事务回滚及mvcc控制
随机读写。

每执行一次事务,都需要做一次fsync操作,因此磁盘的性能影响fsync的性能, fsync性能也就影响到数据库的性能。 数据库可以通过参数来控制,提交事务时不写日志,而是由异步操作来刷日志,但是异常时会丢一个周期内的事务数据。

innodb_flush_log_at_trx_commit参数设置 0\1\2
默认 1
1 : 每commit一次调用一次fsync写日志,写数据文件
0: 异步控制,mysql线程每隔1秒异步执行fsync, db crash 会有1秒的数据丢失
2: 异步控制,写入操作系统缓存,不进行fsync,由操作系统进行调度fsync,操作系统crash会有数据丢失。

二进制日志与重做日志的区别:
1、二进制日志所有存储引擎都有的,而重做日志只有innodb才有
2、二进制日志是逻辑日志,里面记录了sql语句,而重做日志是物理日志,记录的是每个页的修改page位置等信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值