InnoDB底层原理与Mysql日志机制

128 阅读2分钟

底层原理其实就是Buffer pool缓存加日志。 客户端跟服务端建立连接,服务端主要有两层:Server层和引擎层

词法分析器

优化器:决定使用哪个索引,或者在一个语句中有多表关联的时候,决定各个表的链接顺序,以及mysql自己内部的优化机制。

执行器

Mysql日志机制

1. redo log

Redo log日志保证事务的持久性

Redo日志文件顺序写:redo log是一个或者几个预先分配好的磁盘空间文件,写入永远都是在文件末尾增加。 Idb数据文件随机写,不同的数据表有不同的idb文件,比如修改10条sql,修改不同的表需要修改不同的idb文件,不能实现顺序读写的效果,先写redo log再刷新数据库的操作叫做WAL(Write-Ahead-log)机制,效率更高。日志文件顺序写,优化刷盘效率。

读已提交和可重复读:以事务1能否读到事务2提交的数据来进行判断,能的话就是读已提交,不能的话就是可重复读

事务的隔离级别是为了解决脏读,不可重复读,幻读而设计的。 Mysql默认的是RR隔离级别,因为需要保证事务ACID中的隔离性的特征。为了提高并发效率一般大型互联网公司会选择RC作为MySQL的隔离级别?

2. binlog

binlog 二进制日志记录保存了所有的执行过的修改的操作语句,不保存查询的语句。如果Mysql意外宕机了,可以通过排查binlog二进制文件,用户操作或者表结构操作,从而来恢复数据库的数据。 MySQL5.7 版本中,binlog默认是关闭的,8.0版本默认是打开的

3. undo log回滚日志

保证事务的原子性,InnoDB对undolog文件的管理采用断的形式,也就是回滚段(rollback segment)每个回滚段记录了 1024 个 undo log segment ,每个事务只会使用一个undo log segment。

undo log日志什么时候会被清除?

新增类型的,在事务提交时候就可以清除掉了,修改类型的,事务提交之后不能立即删除,这些日志用于MVCC。只有当没有事务用到该版本信息时候才可以清除

4. 通用查询日志

通用查询日志记录用户的所有的操作,一般是在线上出现问题的时候,短暂的开启,排查一些疑难的问题,比如重复支付问题。开启的时候会消耗大量的资源