先看看一条SQL如何入库的

数据写入详细过程

  1. 应用服务器与MySQL建立连接
  2. 通过连接发送一条SQL语句(update student set score=100 where score=50)
  3. SQL依次经过Server层的[分析器][优化器][执行器]
  4. [执行器]根据[执行计划]操作执行引擎(InnoDB Engine)
  5. InnoDB Engine从[磁盘]数据文件中将score=50读取到内存[BufferPool]中
  6. 在修改之前,写入一条[undo log]将修改之前的值score=50保存起来
  7. 先将缓存池[BufferPool]中score=50更新为score=100
  8. 写入一条[redo log]将修改后的score=100存起来,用于异常场景的事务[提交]
  9. 写入一条[bin log]将修改后的score=100存起来
  10. 后台IO线程将缓存池被修改的值score=100刷入磁盘

为什么要拆分出两层架构

这是一条非常简单的SQL语句[update student set score=100 where score=50],从MySQL服务端接收SQL到写入磁盘,经过了Server层和InnoDB存储引擎,中间掺杂着磁盘读取、日志记录、内存更新、写入磁盘。

MySQL为什么将Server层和引擎层拆分?

  • 由MySQL架构演变而来,进而实现「解耦」的效果
  • 针对不同的场景,使用不同的存储引擎,灵活性更强
  • MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力

MySQL主要包含2种存储引擎

  • MyISAM(不支持事务,访问速度快)
  • InnoDB(主流,支持事务)