• innoDB和MyISAM的区别?使用场景?
    • 四层结构:网络连接层;服务器层;存储引擎层;系统文件层
    • InnoDB内存结构:Buffer Pool、Change Buffer、Adaptive Hash Index和Log Buffer四大组件。
    • InnoDB磁盘结构:含Tablespaces,InnoDB Data Dictionary,Doublewrite Buffer、Redo Log和Undo Logs五部分。
    • InnoDB的双写
      • MySQL InnoDB特性:两次写(Double Write)
      • 每次操作16k,如果某次4k时候宕机了,那么这部分数据就错误了(部分页失效问题)。由于redo日志并不能保证幂等性,所以需要双写
      • 简单来说,就是在写数据页之前,先把这个数据页写到一块独立的物理文件位置(ibdata),然后再写到数据页。这样在宕机重启时,如果出现数据页损坏,那么在应用redo log之前, 需要通过该页的副本来还原该页,然后再进行redo log重做,这就是double write。
      • 即:先备份一份,然后根据redo日志去操作
    • 重做日志(Redo Log)

      重做日志是一种基于磁盘的数据结构,用于在崩溃恢复期间更正不完整事务写入的数据。MySQL以循环方式写入重做日志文件,记录InnoDB中所有对Buffer Pool修改的日志。当出现实例故障(像断电),导致数据未能更新到数据文件,则数据库重启时须redo,重新把数据更新到数据文件。读写事务在执行的过程中,都会不断的产生redo log。默认情况下,重做日志在磁盘上由两个名为ib_logfile0和ib_logfile1的文件物理表示。

    • 撤销日志(Undo Logs)

      撤消日志是在事务开始之前保存的被修改数据的备份,用于例外情况时回滚事务。撤消日志属于逻辑日志,根据每行记录进行记录。撤消日志存在于系统表空间、撤消表空间和临时表空间中。 // 存放版本链

    • 线程模型
      • IO Thread
        • read thread : 负责读取操作,将数据从磁盘加载到缓存page页。4个
        • write thread:负责写操作,将缓存脏页刷新到磁盘。4个
        • log thread:负责将日志缓冲区内容刷新到磁盘。1个
        • insert buffer thread :负责将写缓冲内容刷新到磁盘。1个
      • Purge Thread
        • 回收已提交事务的undo日志
      • Page Cleaner Thread
        • 作用是将脏数据刷新到磁盘,脏数据刷盘后相应的redo log也就可以覆盖,即可以同步数据,又能达到redo log循环使用的目的。会调用write thread线程处理。
      • Master Thread
        • 是InnoDB的主线程,负责调度其他各线程
    • 数据文件存储结构
      • 一个ibd数据文件—>Segment(段)—>Extent(区)—>Page(页)—>Row(行)
    • MVCC多版本控制