mysql
2023-01-03 16:18:43 0 举报
AI智能生成
mysql
作者其他创作
大纲/内容
Buffer Pool
定义
InnoDB为了缓存磁盘中的页,在MySQL服务器启动的时候就向操作系统申请了一片连续的内存,他们给这片内存起了个名,叫做Buffer Pool(中文名是缓冲池)
内部组成
控制块
缓存页
free链表
定义:我们可以把所有空闲的缓存页对应的控制块作为一个节点放到一个链表中,这个链表也可以被称作free链表(或者说空闲链表)
缓存页的哈希处理
作用:判断某个页是否在Buffer Pool中
实现:用表空间号 + 页号作为key,缓存页作为value创建一个哈希表,在需要访问某个页的数据时,先从哈希表中根据表空间号 + 页号看看有没有对应的缓存页,如果有,直接使用该缓存页就好,如果没有,那就从free链表中选一个空闲的缓存页,然后把磁盘中对应的页加载到该缓存页的位置。
flush链表
作用:记录需要刷新到磁盘上的脏页的信息
脏页
修改了Buffer Pool中某个缓存页的数据,那它就和磁盘上的页不一致了,这样的缓存页也被称为脏页(英文名:dirty page
LRU链表
作用:解决缓存不够的场景
为了解决,预读和扫表导致的劣币驱逐良币,这个LRU链表按照一定比例分成两截
young区域
一部分存储使用频率非常高的缓存页,所以这一部分链表也叫做热数据
old区域
另一部分存储使用频率不是很高的缓存页,所以这一部分链表也叫做冷数据
过程
当磁盘上的某个页面在初次加载到Buffer Pool中的某个缓存页时,该缓存页对应的控制块会被放到old区域的头部
在对某个处在old区域的缓存页进行第一次访问时就在它对应的控制块中记录下来这个访问时间,如果后续的访问时间与第一次访问的时间在某个时间间隔内,那么该页面就不会被从old区域移动到young区域的头部,否则将它移动到young区域的头部
只有被访问的缓存页位于young区域的1/4的后边,才会被移动到LRU链表头部,这样就可以降低调整LRU链表的频率
刷新脏页到磁盘
BUF_FLUSH_LRU:从LRU链表的冷数据中刷新一部分页面到磁盘
BUF_FLUSH_LIST:从flush链表中刷新一部分页面到磁盘
BUF_FLUSH_SINGLE_PAGE:将LRU链表尾部的一个脏页同步刷新到磁盘
内存分配
一、多实例
二、chunk
二、chunk
事务
redo
作用:把事务在执行过程中对数据库所做的所有修改都记录下来,在之后系统奔溃重启后可以把事务所做的任何修改都恢复出来,实现持久性
日志格式
日志类型
Mini-Transaction
undo
作用:为了满足事务回滚的需求,实现原子性
问题处理
慢查询优化
监控
开发监控:mybatis扩展点plugins,监控慢sql,发送mq,统计展示
代理监控
server端监控
排查问题
1:看是不是数据太大引起
2:explain
3:optimizer trace
2:explain
3:optimizer trace
解决方案
explain各字段含义
死锁排查
监控
开发捕获异常
server监控
排查问题
解决方案
高可用架构
MySQL 复制架构
GTID
MySQL复制类型
主从复制延迟优化
数据库高可用架构设计
容灾级别
数据核对
InnoDB Cluster和MGR技术
高可用套件——VIP
高可用套件MHA和Orchestrator
数据库备份
全量备份
增量备份
解决并发事务带来问题
mvcc
概念
所谓的MVCC(Multi-Version Concurrency Control ,多版本并发控制)指的就是在使用READ COMMITTD、REPEATABLE READ这两种隔离级别的事务在执行普通的SEELCT操作时访问记录的版本链的过程,这样子可以使不同事务的读-写、写-读操作并发执行,从而提升系统性能
READ COMMITTD、REPEATABLE READ这两个隔离级别的一个很大不同就是:生成ReadView的时机不同,READ COMMITTD在每一次进行普通SELECT操作前都会生成一个ReadView,而REPEATABLE READ只在第一次进行普通SELECT操作前生成一个ReadView,之后的查询操作都重复使用这个ReadView就好了。
版本链
解决问题:解决历史版本的记录问题
实现原理:聚簇索引记录中都包含两个必要的隐藏列(row_id并不是必要的,我们创建的表中有主键或者非NULL的UNIQUE键时都不会包含row_id列):
trx_id:每次一个事务对某条聚簇索引记录进行改动时,都会把该事务的事务id赋值给trx_id隐藏列。
roll_pointer:每次对某条聚簇索引记录进行改动时,都会把旧的版本写入到undo日志中,然后这个隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息。
trx_id:每次一个事务对某条聚簇索引记录进行改动时,都会把该事务的事务id赋值给trx_id隐藏列。
roll_pointer:每次对某条聚簇索引记录进行改动时,都会把旧的版本写入到undo日志中,然后这个隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息。
ReadView
解决问题:需要判断一下版本链中的哪个版本是当前事务可见的
实现原理:
概念
流程
注意点:生成ReadView的时机不同
锁
概念:锁其实是一个内存中的结构
事务对记录改动时会生成一个锁结构与数据关联
内存结构
锁合并
事务并发场景
一致性读(Consistent Reads)
事务利用MVCC进行的读取操作称之为一致性读,或者一致性无锁读,有的地方也称之为快照读
锁定读(Locking Reads)
共享锁,英文名:Shared Locks,简称S锁
独占锁,也常称排他锁,英文名:Exclusive Locks,简称X锁
写操作
DELETE
UPDATE
INSERT
多粒度锁
共享锁(S锁)
共享锁(S锁)
意向共享锁
Intention Shared Lock,简称IS锁。当事务准备在某条记录上加S锁时,需要先在表级别加一个IS锁
意向独占锁
Intention Exclusive Lock,简称IX锁。当事务准备在某条记录上加X锁时,需要先在表级别加一个IX锁
MySQL中的行锁和表锁
InnoDB中的表级锁
元数据锁 Metadata Locks,简称MDL
表级别的IS锁、IX锁
表级别的AUTO-INC锁
InnoDB中的行级锁
LOCK_REC_NOT_GAP
Gap Locks
Next-Key Locks
Insert Intention Locks
隐式锁
字符集与比较规则
存储
行格式
数据结构
文件结构
数据类型
数值类型
整数类型
浮点数类型
定点数类型
日期/时间类型
字符串类型
二进制类型
面试
B+树和B树的区别
子主题
读写分离
优点:
1.主从热备,提高mysql的高可用
2.写主读从,提升系统吞吐
1.主从热备,提高mysql的高可用
2.写主读从,提升系统吞吐
缺点:
1.主从可能会有延迟
2.主从是异步复制,切换可能导致数据丢失
1.主从可能会有延迟
2.主从是异步复制,切换可能导致数据丢失
高可用方案
主从或主主 + Keepalived
MHA
PXC
MGR/InnoDB Cluster
Xenon
Orchestrator
异步复制,半同步复制,全同步复制
mysql如何保证事务
事务
索引覆盖
索引下推
最左前缀原则
聚簇索引与非聚簇索引
InnoDB与Myisam的六大区别
事务隔离级别与问题
脏读
幻读
不可重复读
RC
RR
S
说一次死锁排除流程
为什么用整型做主键
1:比较快,字符串要逐个字符转码比较
2:节省空间,同等树高度存更多数据
mysql用了NIO了么
mysql索引失效的场景
大表如何增加字段或索引
影子临时表
主从表
binlog格式
深度分页问题
课程
mysql主要分支及演变
mysql架构概述
mysql体系架构
mysql日志体系
运行机制
连接机制
查询缓存机制
解析和优化机制
执行引擎机制
存储引擎
InnoDB和MyISAM区别
Innodb内存结构
0 条评论
下一页