MYSQL-->InnoDB引擎底层原理( 二 )


查看变量 innodb_file_per_table看是开的还是关的
里面存放了表结构 , 表数据,索引
General Tablespaces(通用表空间)通用表空间,需要手动通过
create tablespace 表空间名 add datafile '表空间对应的磁盘文件.ibd' engine=innodb;创建通用表空间 。
在创建表的时候可以指定该表空间
create table 表名( 字段....)engine=存储引擎 tablespace 表空间名;Undo Tablespaces(撤销表空间)撤销表空间,MYSQL实例在初始化的时候会自动创建俩个默认的undo表空间(初始大小16M)用来存放undo log日志
默认叫 undo_001和undo_002
Temporary Tablespaces(临时表空间)用来存储用户创建的临时表 。
Doublewrite Buffer Files(双写缓冲区)双写缓冲区,innoDB存储引擎会将数据页冲Buffer Pool刷新到磁盘前,先将数据页写入双写缓冲区文件中,便于系统异常时恢复数据 。
双写缓冲区文件:xxx.dblwr
Redo Log(重做日志)用来实现事务的持久性 。
该日志文件由俩个部分组成:重做日志缓冲区(redo log buffer)和重做日志文件(redo log)
重做日志缓冲区:是在内存中
重做日志文件:是在磁盘在
事务提交后会把所有修改的信息存放在该日志中,用于刷新脏页到磁盘,发生错误时,进行数据恢复使用
以循环的方式写入重做文件,涉及到俩个文件:ib_logfile0和ib_logfile1
后台线程作用:将Innodb缓冲池的数据在合适的时机刷新到磁盘文件中 。
分为四类:
  1. Master Thread
    核心后台线程,负责调度其他线程 。还负责将缓冲池中的数据异步刷新到磁盘中,保持数据的一致性 。
    还包括 , 脏页的刷新 , 合并插入缓冲,undo页的回收
  2. IO Thread
    在InoDB存储引擎中大量使用了AIO来处理IO请求,这样可以极大提高数据库性能,IO Thread主要负责以下IO请求的回调
    线程类型默认个数责任Read thread4负责读操作write thread4负责写操作Log thread1负责将日志缓冲区刷新到磁盘Insert buffer thread1负责将写缓冲区内容刷新到磁盘
    关于AIO(异步IO)和IO(同步IO)
    同步就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回 。也就是必须一件一件事做 , 等前一件事做完了才能做下一件事 。
    异步的概念和同步相对 。当一个异步过程调用发出后,调用者不能立刻得到结果(在此期间,调用者可以去干一些别的事情) 。实际处理这个调用的部件在完成后,通过状态、通知和回调 。
  3. Purge Thread
    主要用于回收事务已经提交的undo log,在事务提交之后 , undo log可能不需要了,就用这个来回收 。
  4. Page Cleaner Thread
    协助Master Thread刷新脏页到磁盘的线程,他可以减轻Master Thread的工作压力,减少阻塞 。
整个流程在增删改查的时候,会操作内存结构区域,如果里面没有数据就从 。磁盘结构中加载 , 然后进行操作 。
最后在特定时间会自动从内存结构中刷新到磁盘中 。在磁盘中进行持久化保存下来
事务原理事务事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交撤销操作请求 。
这些操作要么同时成功要么同时失败 。
事务的四大性质
  1. 原子性
    事务是不可分割的最小操作单元 , 要么全部成功,要么全部失败 。
  2. 一致性
    事务完成时 , 必须使所有的数据保持一致性 。
  3. 隔离性
    数据库系统提高隔离机制,保证事务在不受外部并发操作影响的独立环境运行 。
  4. 持久性
    事务一旦提交或回滚,他对数据库的数据改变就是永久的 。
事务的原理事务的原子性,一致性,持久性都是由redo log和undo log实现的
事务的隔离性是由 锁机制和MVCC实现的 。
redo log重做日志,记录的是事务提交时数据页的物理修改,用来实现事务的持久性 。
该日志文件由俩部分组成:
  1. 重做日志缓冲(redo log buffer)
    在内存中
  2. 重做日志文件(redo log file)
    在磁盘中
当事务提交后会把所有修改信息都存放到该日志文件中 , 用于在刷新脏页到磁盘中,发生错误时 , 进行数据的恢复 。
大概流程:

推荐阅读