- 一条sql语句是怎样执行的
- 系统通过建立网络连接发送到mysql 上,然后经过sql接口,解析器,优化器,执行器几个环节,解析sql,生成执行计划,由执行器负责这个计划执行,调用innodb存储引擎的接口去执行。
- 系统通过建立网络连接发送到mysql 上,然后经过sql接口,解析器,优化器,执行器几个环节,解析sql,生成执行计划,由执行器负责这个计划执行,调用innodb存储引擎的接口去执行。
- innodb重要内存结构-缓冲池
- 缓存很多数据,当缓存中有数据时就不需要去查询磁盘中的数据
- 当存储引擎更新数据时,where id=xx,会将id=xx这行数据看看是否在缓冲池中,如果不在就需要从磁盘中加载到缓冲池中来,而且还会对这行记录加独占锁。避免并发对数据造成不一致性。
- 缓存很多数据,当缓存中有数据时就不需要去查询磁盘中的数据
- undo日志
- update user set name=xx where id =10,执行语句时先把name原先的值和id=10写入undo日志中,以便于后续可能要回滚数据
- update user set name=xx where id =10,执行语句时先把name原先的值和id=10写入undo日志中,以便于后续可能要回滚数据
- 更新缓冲池中的数据
- 当将磁盘中的数据加入到缓冲池中之后对数据加锁之后,还把旧数据写入到undo日志里,这时候就可以开始正式更新数据了,更新的时候先更新缓冲池中的数据,此时该数据就是脏数据
-
redo log buffer:万一数据宕机,如何避免数据丢失
-
此时宕机,现在已经将内存中的数据修改了,但是磁盘中的数据没有修改,必然会造成数据丢失。此时就需要将内存修改的数据写入到redo log buffer里去,用来存放redo日志,记录对数据做了什么。
-
提交事务日志
-
当我们提交一个事务,此时就会根据一定的策略将redo日志从redo log buffer里刷入磁盘文件中去,这个策略通过innodb_flush_log_at_trx_commit来配置,他有几个选项
-
0的时候不会将redo log buffer文件刷入磁盘文件中,宕机就会出现内存数据丢失
-
1的时候,提交事务的时候,就必须将内存刷入到磁盘文件中
-
-
-
2的时候将redo log buffer 提交到redo日志的缓存文件中,而不是进入磁盘文件,可能1miao后才刷入磁盘文件中
-
-
-
-
- 当将磁盘中的数据加入到缓冲池中之后对数据加锁之后,还把旧数据写入到undo日志里,这时候就可以开始正式更新数据了,更新的时候先更新缓冲池中的数据,此时该数据就是脏数据
存储引擎学习笔记
于 2022-10-25 10:48:15 首次发布