sql执行顺序

日志

bin log

binlog存储对数据库所有操作行为的记录,主要用于mysql的主从同步和数据恢复

记录格式

1
2
3
4
5
# 获取binlog有没有开启及日志文件存储的位置
SHOW VARIABLES LIKE 'log_bin%';

# 获取binlog的记录格式
SHOW VARIABLES LIKE 'binlog_format%';

对比

ROW(建议使用) STANTEMENT MIXED
特点 记录对行的操作记录
如果一个update语句更新了10行数据则会存储该10行的操作记录, 记录sql语句 ROW和STANTMENT的混合体
优点 因为是存储基于行的操作记录,所以不会导致主备不一致, 只记录sql语句,相较ROW会更加的减少空间和避免大量的IO操作 减少空间和避免大量的IO操作。同时会判断当前的执行操作会不会导致主备不一致,如果会的话,就会使用ROW格式存储
缺点 IO的操作/文件大小都会比其他俩中更多/更大 可能会导致主备不一致,且因为存储的时sql语句,所有当有慢sql时从库做备份时也会执行一次,导致备份时间过长 相当于其他俩种的折中,但也存在和STATEMENT一样主从备份不一致的问题
日志文件比ROW小,但准确性比ROW底;
日志文件比STATEMENT较大,但准确性比STANRTEMENT高;

redo log

只有当mysql的引擎是innodb时,才会存在,记录事务对数据的修改记录,保证了mysql事务的原子性和持久性

刷盘机制

属性:innodb_flush_log_at_trx_commit

1
2
3
4
5
# 查看刷盘机制类型
SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';

# 查看innodb_log_buffer_size的大小
SHOW VARIABLES LIKE 'innodb_log_buffer_size';

对比

类型 0 1(默认) 2
机制 每次提交事务时不进行刷盘操作, 每次提交事务时都会进行刷盘操作 每次提交事务时都只把redo log buffer内从写入page cache(文件系统缓存)
缺点 mysql挂了或者宕机会缺失1s的数据 只有事务没有完成且mysql宕机了才会缺失1s的数据 只有事务没有完成且mysql宕机了才会缺失1s的数据
备注
  • 后台都会有一个后台线程,每个1s,都会把redo log buffer写到page cache中,然后调用fsyns刷盘,所以说机制为0也会刷盘
  • 当redo log buffer占用的空间达到innodb_log_buffer_size一半时,后台也会主动刷盘
    | | |

innodb_log_buffer_size =0

innodb_log_buffer_size =1

innodb_log_buffer_size =2

undolog

undo log有两个作用:提供回滚和多个行版本控制(MVCC)。
在数据修改的时候,不仅记录了redo,还记录了相对应的undo,如果因为某些原因导致事务失败或回滚了,可以借助该undo进行回滚。
undo log和redo log记录物理日志不一样,它是逻辑日志。可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。