mysql 学习日记
innodb
事务与日志的实现方式
- 有多少种日志;
- 错误日志:记录出错信息,也记录一些警告信息或者正确的信息。
- 查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行。
- 慢查询日志:设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中。
- 二进制日志:记录对数据库执行更改的所有操作。
- 中继日志:中继日志也是二进制日志,用来给slave 库恢复
- 事务日志:重做日志redo和回滚日志undo
- 事物的4种隔离级别
- 读未提交(RU)
- 读已提交(RC)
- 可重复读(RR)
- 串行
- 事务是如何通过日志来实现的,说得越深入越好。
事务日志是通过redo和innodb的存储引擎日志缓冲(Innodb log buffer)来实现的,当开始一个事务的时候,会记录该事务的lsn(log sequence number)号; 当事务执行时,会往InnoDB存储引擎的日志的日志缓存里面插入事务日志;当事务提交时,必须将存储引擎的日志缓冲写入磁盘(通过innodb_flush_log_at_trx_commit来控制),也就是写数据前,需要先写日志。这种方式称为“预写日志方式”
Double Write 二次写
原因:
- mysql最小读写单元是 page ,一个 page 是16KB,系统写磁盘的单位是扇区,一个扇区一般是512B
- 写入途中断电会导致部分写入,page头信息丢失,导致使用 Redo log 也无法恢复数据
解决方案:
- 内存中存放 double-write-buffer(2MB) ,磁盘中共享表空间(2MB)
- 内存中脏页数据回写到磁盘前,把页数据复制到 double-write-buffer
- 分两次,把 double-write-buffer 写到 共享表空间
- 3完成后再把数据回写到数据实际位置
- 当4失败,可以用 共享表空间 恢复数据
change buffer (insert buffer)
原因:数据更新大都是离散的,直接写入磁盘性能较差
仅作用于非聚集索引且非唯一索引的 insert,update,delete 操作
默认大小是 buffer pool 的 25%~50%
- 读写操作经过缓冲池(buffer pool)处理
- 离线把数据合并后,回写到磁盘,可以把多次更改操作合并为一次磁盘写
- 合并操作发生在
- 当整个page被读取到buffer pool时
- 后台定期任务
- crash recovery
- shutdown
- 合并操作发生在
自适应哈希索引(Adaptive Hash Index, AHI)
InnoDB会监控读操作,对频繁访问的索引建立哈希索引;或一个表可以完全放在内存中