mysql链接
- 数据库使用链接池和mysql建立连接,mysql使用链接池来管理连接
sql语句怎么的执行
- 跟mysql建立连接,让线程去监听和读取请求
- sql接口处理接收到的sql语句
- 查询解析去读懂sql语句
- 查询优化器,在读懂sql语句的基础上,选择最优的查询路径
- 存储引擎接口去真正的执行sql语句,决定读取磁盘数据或者内存数据
- 执行器去根据优化器生成的执行计划,调用存储引擎的接口,执行sql语句的逻辑。
InnoDB存储引擎架构
1. 缓冲池。查询时会先查内存缓冲池中查,有数据的话就不用去查磁盘了。如果不在缓冲池中,将数据从磁盘加载到缓冲池中,同时对这条记录加上独占锁。
- undo日志文件,写入数据的旧值,便于回滚。
- 数据修改步骤:① 磁盘文件数据加载进缓冲池 ② 数据旧值写入undo日志文件 ③ 在缓冲池内更改数据值
将修改的记录放到内存的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会丢失,数据丢失。
三种刷盘策略,建议使用①
binlog
binlog是mysql特有的日志文件,redo log是innodb存储引擎特有的日志文件。
- 提交事务时不仅会把redo log写入磁盘文件,还会把更新对应的binlog日志写入磁盘文件中去。
- binlog日志有两种刷盘策略。① sync_binlog =0(默认) 把binlog写入磁盘时,不是直接写入磁盘文件,而是先写入os cache内存缓存。机器宕机,数据丢失。② sync_binlog =1 ,提交事务时,直接写入磁盘,机器宕机,数据不会丢失。
- binlog写入磁盘文件后,会把本次更新对应的binlog文件名称和更新的binlog日志在文件中的位置都写入redo log日志文件里去,同时在redo log文件中写入一个commit标记。完成这个事情,才算完成事务的提交。commit标记用来保持redo log 和binlog日志的一致性。
- 后台IO线程随机将内存更新后的脏数据刷回磁盘。