1.为什么SQL查询不建议使用查询缓存?
在一个表上有更新的时候,跟这个表有关的查询缓存会失效。
2.Mysql中WAL的概念是什么?
WAL:Write-Ahead Logging,即先写日志,后写磁盘。
3.存储引擎InnoDB中的redo log(重做日志)?
首先redo log是InnoDB特有的日志系统,用来记录对磁盘页中数据的变动。
特点:redo log 是物理日志,大小固定,循环写入,当Mysql意外宕机后,记录好的redo log在Mysql重启后可根据redo log 中的记录继续向磁盘中写入数据,这个能力被称之为:crash-safe。
redo log 有两个指针的概念,一个是check point,另一个是write pos,其中check point至write pos之间是需要擦除并写入磁盘中的数据记录,write pos至check point之间是可写入的存储空间大小。当write pos与check point重合后意味着,此时存储引擎需要暂停工作,将redo log中的记录写入磁盘,向后移动check point指针,而后继续工作。
innodb_flush_log_at_trx_commit这个参数设置成 1 的时候,表示每次事务的 redo log都直接持久化到磁盘。这个参数建议设置成 1,这样可以保证MySQL 异常重启之后数据不丢失。
4.Mysql中的binlog(归档日志)?
归档日志binlog是所有Mysql引擎通用的日志系统,用来记录更新逻辑,例:将id为2的数据行删除。
特点:binlog 是逻辑日志,追加写入不会覆盖以前的日志。
sync_binlog 这个参数设置成 1 的时候,表示每次事务的 binlog 都持久化到磁盘。这个参数建议设置成 1,这样可以保证 MySQL 异常重启之后 binlog成 1,这样可以保证 MySQL 异常重启之后 binlog不丢失。
5.一条sql更新语句执行的过程(以InnoDB为例)?
例:将id为2的数据行中的c字段加1。
1)首先执行器调用存储引擎提供的查询接口;
2)存储引擎在内存中查找id为2的数据,找到直接返回给执行器,否则扫描磁盘将id为2的数据读入内存并返回给执行器;
3)执行器将id为2的数据行中的c加1,调用存储引擎的更新接口,更新内存中id为2的数据;
4)存储引擎将更新写入redo log,此时redo log处于prepare状态;
5)执行器将更新逻辑写入binlog;
6)存储引擎提交事务,此时redo log处于commit状态,完成更新操作,后续当存储引擎空闲时通过redo log更新磁盘数据。
6.为何InnoDB中redo log使用“两阶段提交”?
之所以使用两阶段提交,目的是为了让binlog与redo log在逻辑上处于一致,这样当需要通过binlog做数据恢复时保证数据的一致性和正确性。
学习《MySQL实战45讲》丁奇--第二篇 | 日志系统:一条SQL更新语句是如何执行的?总结
最新推荐文章于 2024-06-11 07:30:50 发布