mysql链接

  1. 数据库使用链接池和mysql建立连接,mysql使用链接池来管理连接

image.png

sql语句怎么的执行

  1. 跟mysql建立连接,让线程去监听和读取请求
  2. sql接口处理接收到的sql语句
  3. 查询解析去读懂sql语句
  4. 查询优化器,在读懂sql语句的基础上,选择最优的查询路径
  5. 存储引擎接口去真正的执行sql语句,决定读取磁盘数据或者内存数据
  6. 执行器去根据优化器生成的执行计划,调用存储引擎的接口,执行sql语句的逻辑。

image.png

InnoDB存储引擎架构

  1. 1. 缓冲池。查询时会先查内存缓冲池中查,有数据的话就不用去查磁盘了。如果不在缓冲池中,将数据从磁盘加载到缓冲池中,同时对这条记录加上独占锁。
  1. undo日志文件,写入数据的旧值,便于回滚。
  2. 数据修改步骤:① 磁盘文件数据加载进缓冲池 ② 数据旧值写入undo日志文件 ③ 在缓冲池内更改数据值
  3. 将修改的记录放到内存的Redo Log Buffer文件中,如果提交事务,会根据一定的策略把redo日志从redo log buffer 里刷入到磁盘文件中,这个策略通过innodb_flush_at_trx_commit来配置的。

    ① innodb_flush_at_trx_commit =0,提交事务时,不会把redo log buffer里的数据刷入磁盘文件。事务提交成功,mysql宕机,数据和redo文件都丢失;
    ② innodb_flush_at_trx_commit =1 ,提交事务时,会把redo log buffer里的数据刷入磁盘文件。事务提交成功后,redo文件就会在磁盘中。,ysql宕机,数据不会丢失,根据redo日志去恢复修改数据;
    ③ innodb_flush_at_trx_commit =2,提交事务时,会把redo log buffer里的数据刷入os cache内存缓存中,没有实际进入到磁盘中,机器宕机,os cache的redo log会丢失,数据丢失。
    三种刷盘策略,建议使用①
    image.png

    binlog

  4. binlog是mysql特有的日志文件,redo log是innodb存储引擎特有的日志文件。

  5. 提交事务时不仅会把redo log写入磁盘文件,还会把更新对应的binlog日志写入磁盘文件中去。
  6. binlog日志有两种刷盘策略。① sync_binlog =0(默认) 把binlog写入磁盘时,不是直接写入磁盘文件,而是先写入os cache内存缓存。机器宕机,数据丢失。② sync_binlog =1 ,提交事务时,直接写入磁盘,机器宕机,数据不会丢失。
  7. binlog写入磁盘文件后,会把本次更新对应的binlog文件名称和更新的binlog日志在文件中的位置都写入redo log日志文件里去,同时在redo log文件中写入一个commit标记。完成这个事情,才算完成事务的提交。commit标记用来保持redo log 和binlog日志的一致性。
  8. 后台IO线程随机将内存更新后的脏数据刷回磁盘。

image.png