首先再明确一下MySQL的两阶段提交过程,如下图所示:
如果在时刻1 数据库宕机,则将事务回滚
如果在时刻2 数据库宕机,则如果binlog 已经完整写好,则提交事务;否则回滚事务。
Binlog存在固定的完整格式,statement格式的binlog,最后会有COMMIT;row格式的binlog,最后会有一个XID event,除此之外,还有check sum来进行内容校验。而redo log与binlog通过XID进行关联。
为什么binlog写完整了就一定要提交事务?
因为binlog会被应用到主从同步,如果从库执行了binlog而主库恢复的时候回滚事务,则会发生主从不一致。
Redo log buffer用于缓存一个事务中的多个更新内容,等到commit的时候写入磁盘文件。
MySQL索引为何失效
一般情况下,出现索引失效,根本原因都是对索引字段做函数操作,会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。这个函数操作既包括显式的函数也包括隐式的类型转换,比如说传入的参数与表中的字段类型不一致(数字与字符串比较字符串会默认转换成数字),或者不同表之间的join操作由于字符集不同而发生的隐式转换,为了避免这种情况,我们可以尽量采用显式转换。
MySQL实战45讲