mysql

mysql 学习日记

innodb

事务与日志的实现方式

  1. 有多少种日志;
    • 错误日志:记录出错信息,也记录一些警告信息或者正确的信息。
    • 查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行。
    • 慢查询日志:设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中。
    • 二进制日志:记录对数据库执行更改的所有操作。
    • 中继日志:中继日志也是二进制日志,用来给slave 库恢复
    • 事务日志:重做日志redo和回滚日志undo
  2. 事物的4种隔离级别
    • 读未提交(RU)
    • 读已提交(RC)
    • 可重复读(RR)
    • 串行
  3. 事务是如何通过日志来实现的,说得越深入越好。
    事务日志是通过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 也无法恢复数据

解决方案:

  1. 内存中存放 double-write-buffer(2MB) ,磁盘中共享表空间(2MB)
  2. 内存中脏页数据回写到磁盘前,把页数据复制到 double-write-buffer
  3. 分两次,把 double-write-buffer 写到 共享表空间
  4. 3完成后再把数据回写到数据实际位置
  5. 当4失败,可以用 共享表空间 恢复数据

change buffer (insert buffer)

原因:数据更新大都是离散的,直接写入磁盘性能较差
仅作用于非聚集索引且非唯一索引的 insert,update,delete 操作
默认大小是 buffer pool 的 25%~50%

  1. 读写操作经过缓冲池(buffer pool)处理
  2. 离线把数据合并后,回写到磁盘,可以把多次更改操作合并为一次磁盘写
    • 合并操作发生在
      • 当整个page被读取到buffer pool时
      • 后台定期任务
      • crash recovery
      • shutdown

自适应哈希索引(Adaptive Hash Index, AHI)

InnoDB会监控读操作,对频繁访问的索引建立哈希索引;或一个表可以完全放在内存中