998_MySQL原理
2024-05-23 21:32:56 0 举报
MySQL原理深度剖析
作者其他创作
大纲/内容
数据页16k描述一行数据一行数据一行数据...
冗余
IO 设备驱动层
chunk1 128m
redo log block
缓存页描述信息
文件尾部 8byte
2.2、加载数据页到内存
数据区256 64个数据页
connection
日志格式:MLOG_1BYTE 表空间id,数据页号,数据页中数据偏移量,具体修改的数据
header
connection pool
【extent组1:{extent1:[数据页1:o3oieno23in428n30 ]....[数据页64:sundf0aud0f8q20] } { extent2:893809097*((^B79B^97B } ....{ extent256:9w7er98e7nrn239 }】48nw98ern98snf98sdnf98sun8we798sdf8nsd98fnsd98fnsdfn0sd8fn0s98d0984092dfoidsnfoufu98982379niufoidofisoidfunoiu230989038234weiroppoiweporipwoeirutsdcv0xc7bv07*B&89^9&V*(*%v&^(*7tBIOUyBo&^978^V987^9*&*)&b)(*7b(6(*B*y&(b7n908u0us87f908bB(87(*07b)(*7b)(*7b90B&0bsdfoisdfoiur09ss7v0x9087800f0m89B
每个表空间第1个数据区组的第1个数据区的前3个数据页FSP_HDR 数据页:表空间和数据区的属性IBUF_BITMAP数据页:这一组数据页的insert buffer信息INODE数据页
redo log
行溢出
数据区组1 256个数据区
redo log buffer
9 刷入redo log日志文件
数据区2 64个数据页
6、提交事务redo日志刷磁盘
7、提交事务binlog日志
IO 设备
数据页描述一行数据一行数据一行数据...
1、执行SQL
SQL优化器SQL执行策略
trailer
2.3、将数据缓存页放入LRU缓存链表冷区的头部
数据页16k
LRU双向链表
IO 调度层(CFQ公平调度、deadline调度算法)MySQL中最好改为deadline,否则slow sql会影响正常SQL执行效率
磁盘
热 区 63%
Too many connections1、确实没有配置够max_connections,可以用show variables like '%max_connections%'2、Linux文件句柄数限制,修改max_open_files命令:ulimit -HSn 65535查看:cat /etc/security/limits.confcat /etc/rc.local3、尽量别用swapecho 0 > /proc/sys/vm/swappiness
一行数据
磁盘上的文件(表空间,表名.ibd)修改数据页,相当于修改一个文件中的一段数据,从起始位置到结束位置就是一个数据页
1/4 不移动
NFS
3/4 移动
移除对应缓存页
冷区 37%
Ext3
redo log buffer刷盘时机1、buffer超过总大小一半,如8M,常发生于高并发增删改。2、一次事务提交,将redo log group刷盘3、每隔1秒自动刷盘4、MySQL shutdown自动刷盘
如果free不够,则将冷区末尾缓存页刷入磁盘,放回free
表空间 划分为N个数据组表名.ibd
缓存SDRAM
先从page cache中找
binlog日志文件
数据页16k描述前一页数据行的部分数据
InnoDB存储引擎
决定谁先执行
移除缓存页
缓存页描述一行数据一行数据一行数据...
undo log文件rollback时回滚的数据log开始位置主键列长+列值表idundo log 编号undo log 类型log结束位置
VFS
转交给对应的文件系统读写IO请求
body
flush双向链表
IO线程定时将LRU冷区尾部刷入文件
IO 请求 先写(读)缓存然后写磁盘若断电宕机,可以有锂电池供电将缓存中的数据写入磁盘,不会丢失数据。锂电池为了保持寿命,会自动30d充放电,在充放电期间是关闭缓存的,所以会造成IO抖动,可以通过在低峰的时候手动充放电且不要讲缓存级别从write back改为write through
Linux 文件系统
redo log block 512字节
数据页哈希表表空间号+数据页号 = 缓存页地址表空间号+数据页号 = 缓存页地址表空间号+数据页号 = 缓存页地址
涉及到的配置[server]# buffer pool大小innodb_buffer_pool_size = 2147483648 # buffer pool数量,若分配给buffer pool的内存大于4g,可以考虑innodb_buffer_pool_instances = 2# redo log 刷盘时机# 0-不刷盘# 1-提交事务就刷磁盘# 2-刷os cache,一秒后刷盘innodb_flush_log_at_trx_commit = 1#redo log buffer大小默认16minnodb_log_buffer_size = 16777216#redo log file dirinnodb_log_group_home_dir#每个redo log文件大小,默认48m,一条log是几字节能存几百万条loginnodb_log_file_size = 48m#redo log文件数量,默认2,ib_logfile0/ib_logfile1innodb_log_files_in_group = 2# binlog刷盘 0-先刷如os cache ,1-直接刷盘sync_binlog = 1
redo log group
数据页目录 x byte
SQL解析器 parser
申请IO调度
5、写redo日志
数据区组n
文件头 38byte
3、写undo日志
chunk.N 128m
数据页头 56byte
SQL接口
将处理结果层层反馈
数据区1
redo log buffer缓冲区
放回free链表
4、更新内存数据(脏数据)
x byte
通用block层
同一个事务是一组redo log group1、一个大group放到多个rbuffer中2、多个小group放到一个buffer中
BufferPool 8G。多个chunk组成,每个chunk拥有完整的bufferpool结构,方便动态调整缓存组件
[ 0x09 0x04 ] [ 00000101 ] [ 0000000000000000000010000000000000011001 ] [ 00000000094C(DB_ROW_ID)00000000032D(DB_TRX_ID) EA000010078E(DB_ROL_PTR)] [ 616161 636320 6262626262 ]
拉取SQL
一组事务redo log
IO线程将buffer pool修改的数据刷磁盘
锂电池30d充放电
RAID10 磁盘阵列
8、修改记录的binlog文件位置和commit标记追加到redo log buffer缓冲区
磁盘文件
chunk2 128m
SQL执行器按照执行策略调用存储引擎组件
最大记录 26byte最小记录
空闲区域 x byte
将文件IO请求转为Block IO 请求
extent 数据区1 1mb64个连续数据页
Page Cache 缓存页
free双向链表 16k
Ext2
redo log buffer block 512字节
MySQL进程
redo磁盘文件,redo log文件
4.2、将修改的数据的缓存页描述信息指针指向flush列表中
数据区组2
SQL线程sql请求分发
一行数据可变字段长度(varchar字段实际长度的16进制),可变字段长度,允许为null字段标识组合,40bit数据头,DB_ROW_ID(隐藏行ID字段),DB_TRX_ID(隐藏事务ID),DB_ROLL_PTR(隐藏回滚指针),字符集编码后的value1,字符集编码后的value2,字符集编码后的value3....
表空间其他数据组的第1个数据区的前2个数据页XDES数据页:这一组数据区的信息
Application
移除lru链表
追加写入
2.1 先看是不是已经存在缓存页
加载到buffer pool中的缓存页对应的描述信息从free中剔除
定时刷磁盘
0 条评论
回复 删除
下一页