存储引擎
InnoDB引擎:
- 所有表存放在一个数据文件中
- 对内存需求大,在主存中会建立专用的缓冲池
- 使用聚簇索引,数据和索引集中存储,在非主键索引的叶子结点中存放主键,需要进行回表
- 支持外键和事务
- 对于数据的增删改性能更优
- 支持行级锁、表级锁,锁定力度小并发能力高
MylSAM引擎:
- 每张表被放在三个文件中:frm表格定义、MYD数据文件、MYI索引文件
- MylSAM可以被压缩,存储空间小
- 使用非聚簇索引,在叶子结点中存储数据地址,需要再次寻址才能得到数据
- 不支持外键和事务
- 只支持表级锁,锁颗粒度较大
- 在数据查询上效率更高
Memory引擎:所有的数据都存储在内存中,数据处理效率高但是不安全
日志
存储引擎级别日志
重做日志(redo log):物理日志,用于保持事务的持久性,每当操作时,在磁盘数据变更之前,将操作写入redo log,这样当系统奔溃重启后可以继续执行。redo log 转移到磁盘中的过程是顺序读写,把原本的随机读取转变为顺序读写可以提高效率,相当于一个位于磁盘的数据缓冲区,记录下数据的改变。
回滚日志(undo log):用于保持事务的原子性和一致性,InnoDB引擎在事务回滚时通过undo log实现,在进行DML操作时,会记录一条操作语句的快照,每条快照有一个指针指向上一条快照,这样一来undo log会形成一个链表,链首是最新的记录,链尾是最旧的记录,这个链不回无限增长,有个purge线程,定期删除无用的undolog数据。
事务回滚的实现方式:mysql会默认在表中加入 roll_back回滚指针,当对字段值进行操作时后,回滚指针指向上一条操作语句。undo日志对每一条操作语句形成快照,需要回滚时,根据回滚指针找到上一条操作语句,重新执行完成回滚。
Mysql Server层次日志
二进制日志(bin log):主要用在主从复制,数据库的表结构变更、表数据修改都会更以二进制存储在磁盘上,每一条记录称作事件,binlog 的主要目的是复制和恢复。通过binlog就可以将一个MySQL数据库服务器(master) 的数据复制到一个或多个其他MySQL数据库服务器
错误日志(error log):错误日志包含 mysqld 启动和关闭的时间信息,诊断消息,服务器在运行过程中发生的故障和异常情况等。
慢查询日志(slow query log):记录在 MySQL 中响应时间超过阀值的语句,阈值由参数long_query_time决定, 默认值为 10,单位是s
中继日志(relay log):,一般情况下用在MySQL主从复制的从节点,用于存储主节点bin log同步过来的日志内容,从节点从relay log 中读取数据部署到从节点数据库中,起到了中介作用。
二阶段提交
多用于主从复制中,在进行完DML操作后,记录一条 redolog + 标志位 prepare ,然后再binlog中记录一条事件,再回到 redolog中 记录一条日志 标志位为 commit,表示已经提交。实际 redolog 和 binlog 是同步操作 保持一致
如果在 prepare 到 binlog 过程出现问题,恢复数据时首先检查redolog状态是不是commit 是 提交数据 ,不是 ,根据事务编号查看binlog中是否有匹配的记录,没有 该记录作废
如果在binlog 到 commit 出现问题,数据恢复时,查看是否是commit状态,不是 查看binlog中是否有匹配事件,有 将redolog中的prepare状态改为commit。