MySQL技术:InnoDB存储引擎阅读笔记(一)
 
 
 
第一章以及第二章前半部分 
数据库和数据库实例的区别 
数据库是二进制文件,存放在二级存储器,数据库实例是程序进程,用来完成对数据库的一系列操作。  
数据库体系结构 
   包括以下几部分:  
- 连接池组件
 - 管理服务和工具组件
 - SQL接口组件
 - 查询分析器组件
 - 优化器
 - 缓冲
 - 插件式存储引擎
 - 物理文件
   
InnoDB引擎的特点 
- 存储引擎是基于表的,而不是数据库
 - 行锁设计
 - 支持外键
 - 支持非锁定读(默认读操作不会产生锁)
 - InnoDB使用MVCC(多版本并发控制)来获得高并发性。实现了SQL标准的4种隔离级别
 - 使用next-key locking的策略避免幻读产生
 - 提供插入缓冲、二次写、自适应哈希索引、预读等功能
 - 可以查看MySQL官方手册了解几个不同存储引擎的区别
   
InnoDB体系架构 
 InnoDB存储引擎有多个内存块,可以认为这些内存块组成一个大的内存池,负责:  
- 维护所有进程/线程需要访问的多个内部数据结构
 - 缓存磁盘上数据,方便快速地读取,同时对磁盘文件的数据修改之前在这里缓存
 - 重做日志缓冲
   
后台线程的主要作用是刷新内存池中的数据,保证缓冲池中内存缓存的是最新的数据,此外将已经修改的数据文件刷新到磁盘文件,保证在数据库发生异常的情况下InnoDB能回复到正常运行状态。  
线程 
InnoDB是多线程的模型。所以后台有多个不同的后台线程,处理不同任务。  
- Master thread:核心的后台线程,负责将缓冲池中的数据异步刷新到磁盘,保证数据一致性。包括1脏页的刷新,2合并插入缓冲,3UNDO页的回收。
 - IO Thread:InnoDB中大量使用AIO处理IO请求。IO Thread负责这些IO请求的回调处理。
 - Purge Thread:事务被提交后,其锁使用的undo_log可能不再需要,因此需要Purge Thread来回收已经使用并分配的undo页。Purge Thread以前是在Master Thread中的,现在可以单独作为线程使用,使用 innodb_purge_threads = 1来启用,且支持多个线程。
 - Purge Cleaner Thread :将之前版本中脏页的刷新操作都放入到单独的线程中来完成,减轻Master Thread的工作,以及对于用户查询线程的阻塞。
   
内存 
InnoDB存储引擎是基于磁盘存储的。将记录按照页的方式进行管理。  缓冲池的作用是为了缓解cpu速度和磁盘读取速度的差距。  缓冲池简单说 就是 一块内存区域。通过内存速度来弥补磁盘速度较慢对数据库性能影响。  
- 读取操作:先将磁盘的页放入缓冲池,如果下一次再读取相同的页,判断是否在缓冲池中,如果在,就是命中,不在,则从磁盘读取。
 - 修改操作:先修改在缓冲池中的页,以一定频率刷新到磁盘上。以一种Checkpoint机制刷新回到磁盘。
 - 缓冲池大小可以通过 参数 innodb_buffer_pool_size 设置。
 - 缓冲池中具体缓存的数据页,不能简单地认为只有索引页和数据页。如下图:
   
                
                
                
        
        
    
 
 |