MySQL

9/1/2022 MySQL

# 存储引擎

# MyISAM(5.5以前默认存储引擎)

表级锁(table-level locking),不提供事务支持,不支持外键,不支持数据库异常崩溃后的安全恢复

# InnoDB(事务性数据库引擎)

行级锁(row-level locking)(默认)和表级锁,提供事务支持,支持外键

# 二进制日志

binlog(归档日志)-Server层

# statement
# row
# mix

# 事务日志(InnoDB 引擎)

redo log(重做日志)-保证事务的持久性

undo log(回滚日志) -保证事务的原子性

锁机制、MVCC-保证事务的隔离性

MVCC 可以看作是行级锁的一个升级,可以有效减少加锁操作,提高性能

# 锁的算法

# Record lock-记录锁
# Gap lock-间隙锁
# Next-key lock-临键锁

# 内存结构详解

# Buffer Pool(LRU算法)

MySQL 会先改内存,然后记录 redo log,等有空了再刷磁盘,如果内存里没有数据,就去磁盘 load,以「页」(page)为单位从磁盘读取数据的,Buffer Pool 里的数据也是如此,实际上,Buffer Pool 是a linked list of pages,一个以页为元素的链表

# 写缓冲 Change Buffer

如果 MySQL 发现你要修改的页,不在内存里,就把你要对页的修改,先记到一个叫 Change Buffer 的地方,同时记录 redo log,然后再慢慢把数据 load 到内存,load 过来后,再把 Change Buffer 里记录的修改,应用到内存(Buffer Pool)中

merge:Change Buffer -> Buffer Pool

purge:Buffer Pool -> Disk

# 自适应hash索引(Adaptive Hash Index)

子会监控对表上各索引页的查询,如果观察到建立hash索引可以提高查询速度,则自动建立hash索引1

# Log Buffer

使大型事务可以运行,而无需在事务提交之前将redo日志数据写入磁盘,节省了磁盘I/O

# 磁盘结构

# Tables
# Indexes
# Tablespaces
# Doublewrite Buffer

Change Buffer 是提升性能,那么 Doublewrite Buffer 就是保证数据页的可靠性

MySQL 在刷数据到磁盘之前,要先把数据写到另外一个地方,也就是 Doublewrite Buffer,写完后,再开始写磁盘,Doublewrite Buffer 可以理解为是一个备份(recovery),万一真的发生 crash,就可以利用 Doublewrite Buffer 来修复磁盘里的数据

# Redo Log
# Undo Logs
# 写缓冲 Change Buffer

# 日志

# 二进制日志

# 事务日志(InnoDB 引擎)

# 多机

Last Updated: 4/15/2023, 1:36:11 AM