mysql 技术内幕
2022-02-28 17:00:26 19 举报
AI智能生成
mysql技术内幕存储引擎书本思维导图
作者其他创作
大纲/内容
锁
InnoDB存储引擎中的锁
一致性非锁定读(MVCC)
一致性锁定读
自增长与锁
外键和锁
事务
认识事物
概述
分类
事务的实现
redo
undo
基本概念
undo存储管理
undo log格式
insert into log
update undo log
查看undo格式
purge
group commit
备份与恢复
概述
按类型
按备份后的文件内容
按备份数据库内容
冷备
逻辑备份
mysqldump
select ... into outfile
逻辑备份的恢复
load data infile
mysqlimport
二进制日志备份与恢复
热备
ibbackup
XtrBackup
快照备份
主从复制
主从复制概述
如何提升数据库并发能力
优化sql和索引
redis缓存热点数据
mysql读写分离
主从复制的作用
读写分离
数据备份
高可用性
主从复制原理
三个线程
二进制日志转储线程
从库 I/O 线程
从库 SQL 线程
原理图
监控
一主一从架构搭建
docker容器搭建
非docker容器搭建
同步数据一致性问题
主从同步的要求
读库和写库的数据一致(最终一致)
写数据必须写到写库
读数据必须到读库(不一定)
理解主从延迟问题
主从延迟问题原因
从库的机器性能比主库要差
从库的压力大
大事务的执行
如何减少主从延迟
降低多线程大事务并发的概率,优化业务逻辑
优化SQL,避免慢SQL, 减少批量操作 ,建议写脚本以update-sleep这样的形式完成
提高从库机器配置,减少主库写binlog和从库读binlog的效率差
尽量采用短的链路,也就是主库和从库服务器的距离尽量要短,提升端口带宽,减少binlog传输的网络延迟
实时性要求的业务读强制走主库,从库只做灾备,备份。
如何解决一致性问题
异步复制
子主题
半同步复制
子主题
组复制
mysql配置文件详解
mysql体系结构和存储引擎
定义数据库和实例
数据库
查看数据库所在路径
实例
查看mysql数据库实例
查看实例启动时,加载的配置文件位置
mysql体系结构
子主题
Mysql存储引擎
InnoDB
5.5.8版本为默认存储引擎
4.1版本开始具有ibd文件
next-key locking 临键锁
采用聚集的方式,每张表的顺序按照主键存放
MyISAM
不支持事务、表锁设计、支持全文索引
数据缓冲池只缓存索引文件
由MYD和MYI组成
默认支持4GB大小的表
NDB
集群存储引擎
Memory
数据存放在内存中
使用hash索引
只支持表锁
适用于存放临时数据的临时表
Archive
只支持INSERT和SECLECT
使用zlib算法压缩行存储
适用于存储归档数据,如日志信息
Federated
Maria
InnoDB存储引擎
体系架构
架构图
后台线程
Master Thread
作用
脏页的刷新
数据异步刷新到磁盘
合并插入缓冲池
undo页的回收
工作方式
IO Thread
insert buffer thread
log thread
innodb_read_thread 4线程
innodb_write_thread 4线程
Purge Thread
Page Cleaner Thread
内存
内存数据对象
缓冲池
页
索引页
数据页
undo页
插入缓冲(insert buffer)
自适应哈希字典(adaptive hash index)
innodb存储的锁信息(lock info)
数据字典信息(data dictionary)
LRU List、Free List、Flush List
LRU List
子主题
Free List
子主题
Flush List
子主题
重做日志缓冲 redo log buffer
额外的内存池
Check point技术
write ahead log策略
怎么达到高效性和持久性?
阶段1
阶段2
重做日志(rodo log)的设计
LSN(Log Sequence Number)
工作原理
Sharp Checkpoint
每次刷新多少页
每次从哪里取脏页
什么时间触发Checkpoint
Fuzzy Checkpoint
每次刷新多少页
每次从哪里取脏页
什么时间触发Checkpoint
Master Thread Checkpoint
Flush_LRU_LIST Checkpoint
Async/Sync Flush Checkpoint
Dirty Page too much Checkpoint
Master Thraed工作方式
1.0.X版本之前
主循环(loop)
每秒的操作
日志缓冲刷新到磁盘,即使这个事务还没有提交(总是)
合并插入缓冲(可能)
至多刷新100个InnoDb缓冲池中的脏页到磁盘(可能)
如果当前没有用户活动,则切换到background loop(可能)
每十秒的操作
刷新100个脏页到磁盘(可能的情况下)
合并至多5个插入缓冲(总是)
将日志缓冲刷新到磁盘(总是)
删除无用的Undo页(总是)
刷新100个或者10个脏页到磁盘(总是)
后台循环(background loop)
删除无用的Undo页(总是)
合并20个插入缓冲(总是)
跳回到主循环(总是)
不断刷新100个页直到符合条件(可能,跳转到flush loop)
刷新循环(flush loop)
暂停循环(suspend loop)
1.2.X版本之前
通过参数配置磁盘IO的次数
调整脏页所占缓冲池的比例
新增自适应刷新
调整full purge
1.2.X版本
新增Page Cleaner Thread线程
InnoDB关键特性
插入缓冲(Insert Buffer)
Insert Buffer
前提条件
缺点
Change Buffer
前提条件
三种buffer
Insert Buffer
Delete Buffer
Purge Buffer
查看
Insert Buffer的内部实现
结构
非叶子结点
叶子结点
Merge Insert Buffer
有什么用
什么时候发生
辅助索引页被读取到缓冲池时
Insert Buffer Bitmap页追踪到该辅助索引页已无可用空间时
Master Thread
两次写(Double Write)
实现过程
观察double write运行情况
禁用
自适应哈希索引(Adaptive Hash Index)
提高索引效率
要求
参数配置
异步IO(Async IO)
刷新领接页(Flush Neighbor Page)
启动、关闭和恢复
影响关闭行为
参数值为 0
子主题
参数值为 1
子主题
参数值为 2
子主题
影响恢复
参数值 0
参数值 1
参数值 2
参数值 3
参数值 4
参数值 5
参数值 6
文件
参数文件
什么是参数
参数类型
动态参数
session
global
静态参数
日志文件
错误日志文件(error log)
启动日志
查看日志
作用
二进制日志(bin log)
作用
恢复
复制
审计
启用
永久性方式
子主题
临时性方式
子主题
文件
查看日志
相关参数
max_binlog_size
binlog_cache_size
sync_binlog
binlog-do-db
binlog-ignore-db
log-slave-update
binlog-format
慢查询日志(slow query log)
参数配置
查看慢查询日志
日志数据格式
捕获sql语句的方式
逻辑读取
物理读取
启用慢查询日志的方式
查询日志(log)
Undo日志
概念
Undo日志的作用
回滚数据
MVCC
undo log的生命周期
undo log的删除
针对于insert undo log
针对于update undo log
套字节文件
pid文件
表结构定义文件
InnoDB引擎文件
表空间文件
重做日志(rodo log)文件
概念
工作原理
相关参数
与二进制文日志的区别
日志结构
写入方式
刷盘策略参数:innodb_flush_log_at_trx_commit
设置为0
设置为1
设置为2
表
索引组织表
概念
选择和创建主键
InnoDB逻辑存储结构
表空间
共享表空间
独立表空间
段
数据段
索引段
回滚段
区
页
数据页(B-tree Node)
undo 页(undo Log Page)
系统页(Systm Page)
事务数据页(Transaction system Page )
插入缓冲位图页(Insert Buffer Bitmap)
插入缓冲空闲列表页(Insert Buffer Free List)
未压缩的二进制大对象页(Uncompressed BLOB Page)
压缩的二进制大对象页(compressed BLOB Page)
行
InnoDB行记录格式
COMPACT行格式
变长字段长度列表
NULL值列表
记录头信息(5字节)
delete_mask
min_rec_mask
record_type
heap_no
n_owned
next_record
演示:删除操作
演示:添加操作
记录的真实数据列
隐藏列
事务ID列
回滚指针列
Redundant行格式
行溢出与Char的行结构存储
Dynamic和Compressed行格式
InnoDB数据页格式
第1部分
File Header(文件头部,描述页的信息)
File trailer(文件尾部)
第2部分
Free Space(空闲空间)
User Records(用户记录)
infimum + Supremum(最小最大记录)
第3部分
Page Directory(页目录)
Page Header(页面头部,页头和页的状态)
Name File Formats 机制
约束
视图
分区表
分区概述
分区类型
RANGE分区
LIST分区
HASH分区
KEY分区
COLEMNS分区
分区和性能
索引和算法
概述
数据结构与算法
二分查找法
二叉查找树和平衡二叉树
B+树
插入操作
删除操作
B+树索引
聚集索引
辅助索引
B+树索引分裂
B+树索引管理
索引管理
Fast Index Creation
Online Schema Change
Online DDL
Cardinality
什么是Cardinality
InnoDB存储引擎的Cardinality统计
B+树索引使用
联合索引
指定使用某个索引
Multi_Range Read优化
index condition pushdown(索引下推)
覆盖索引
哈希算法
哈希表
InnoDB存储引擎的哈希算法
自适应哈希索引
全文索引
收藏
收藏
0 条评论
下一页