MySQL innodb引擎深入讲解( 二 )


参数为: innodb_data_file_path

MySQL innodb引擎深入讲解

文章插图
 
独立表空间(*.ibd): 每个表的文件表空间包含单个innodb表的数据和索引 , 并存储在文件系 统上的单个数据文件中 。参数: innodb_file_per_table
通用表空间: 需要通过create tablespace 语法创建 , 创建表时 可以指定该表空间 。
create tablespace xxx add datafile 'file_name' engine=engine_name
create table table_name .... tablespace xxx
撤销表空间(undo tablespaces): MySQL实例在初始化时会自动创建两个默认的undo表空间(初始大小16K , undo_001,undo_002) , 用于存储undo log 日志
临时表空间(Temporary Tablespaces): innodb使用会话临时表空和全局表空间 , 存储用 户创建的临时表等数据 。
双写缓冲区(Doublewrite Buffer files): innodb引擎将数据页从Buffer Pool刷新到磁盘前 , 先将数据页写入缓冲区文件中 , 便于系统异常时恢复数据 。
重做日志(Redo Log): 是用来实现事务的持久性 , 该日志文件由两部分组成 , 重做日志缓冲区(redo log buffer)以及重做日志文件(redo log) , 前者是在内存中 , 后者在磁盘中 , 当事务提交之后会把修改信息都会存储到该日志中 , 用于在刷新脏页到磁盘时 , 发送错误时 , 进行数据恢复使用 。以循环方式写入重做日志文件 , 涉及两个文件ib_logfile0,ib_logfile1 。
那内存结构中的数据是如何刷新到磁盘中的? 在MySQL中有4个线程负责刷新日志到磁盘 。
1、Master Thread ,  mysql核心后台线程 , 负责调度其它线程 , 还负责将缓冲池中的数据异 步刷新到磁盘中 , 保持数据的一致性 , 还包括脏页的刷新 , 合并插入缓冲、undo页的回 收 。
2、IO Thread , 在innodb存储引擎中大量使用了AIO来处理IO请求 , 这样可以极大地提高数 据库的性能 , 而IO Thead主要负责这些IO请求的回调 。
4个读线程 Read thread负责读操作
4个写线程write thread负责写操作
1个Log thread线程 负责将日志缓冲区刷新到磁盘
1个insert buffer线程 负责将写入缓冲区内容刷新到磁盘
3、Purge Thread , 主要用于回收事务已经提交了的undo log , 在事务提交之后 , undo log 可能不用了 , 就用它来回收 。
4、Page Cleaner Thread ,  协助Master Thread 刷新脏页到磁盘的线程 , 它可以减轻主线程 的压力 , 减少阻塞 。
MySQL innodb引擎深入讲解

文章插图
 
事务原理事务就是一组操作的集合 , 它是一个不可分割的工作单位 , 事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求 , 即这些操作要么同时成功 , 要么同时失效 。
事务的4大特性分为:
  • 原子性atomicty: 事务是不可分割的最小操作单元 , 要么全部成功 , 要么全部失效 。
  • 一致性consistency: 事务完成时 , 必须使所有的数据都保持一致状态 。
  • 隔离性isolation: 数据库系统提供的隔离机制 , 保证事务在不受外部并发操作影响的独立 环境下运行 。
  • 持久性durability: 事务一旦提交或回滚 , 它对数据库中的改变就是永久的 。
如何保证事务的4大特性 , 原子性 , 一致性和持久性是由innodb存储引擎底层的两份日志来保证的 , 分别是redo log和undo log 。对于隔离性是由锁机制和MVCC(多版本并发控制)来实现的 。
redo log , 称为重做日志 , 记录的是事务提交时数据页的物理修改 , 是用来实现事务的持久性 。该日志文件由两部分组成: 重做日志缓冲redo log buffer及重做日志文件redo log file , 前者是在内存中 , 后者是在磁盘中 , 当事务提交之后会把所有修改信息都存到该日志文件中 , 用于在刷新脏页到磁盘 , 发送错误时 , 进行数据的恢复使用 , 从而保证事务的持久性 。
具体的操作流程是:
1、客户端发起事务操作 , 包含多条DML语句 。首先去innodb中的buffer pool中的数据页去查找有没有我们要更新的这些数据 , 如果没有则通过后台线程从磁盘中加载到buffer pool对应的数据页中 , 然后就可以在缓冲池中进行数据操作了 。


推荐阅读