mysql 原理 笔记
2021-01-23 18:20:04 4 举报
mysql
作者其他创作
大纲/内容
一行数据
必须在redolog里有本次更新对应的日志,binlog也有本次更新对应的日志,才能认为本次事务提交成功
redo log日志文件
开始节点
最小主键id+数据页号
调用接口完成sql语句
解析sql
获取sql
free链表
free链表,用来指向空闲缓存页的描述数据
flush链表,用来记录被修改过的缓存页的描述数据块
将冷数据区一些不用的缓存页刷新到磁盘中
将这些缓存页加入到free链表
buffer pool缓冲池默认是128Mb
3、更新内存数据
flush链表里指向的数据页,就是脏页,就是被修改过但是还没刷到磁盘里去的缓存数据页
一组数据区(包含64个数据页),1mb
描述数据
查询优化器
内存
redo log block
后台线程
文件尾部
LRU链表,只要被使用过的缓存页,就把描述数据放到链表头部
基础节点count=n
生产优化经验一般建议MySQL的生产环境,需要调整为deadline IO调度算法,他的核心思想就是,任何一个IO操作都不能一直不停的等待,在指定时间范围内,都必须让他去执行。linux的文件句柄限制,导致了MySQL的最大连接数被限制。(show variables like 'max_connections'是否跟配置文件配置的max_connections相等)解决:ulimit -HSn 65535然后就可以用如下命令检查最大文件句柄数是否被修改了cat /etc/security/limits.conf;cat /etc/rc.local
结束节点
最优查询路径
1、为了防止预读数据页占据lru链表的前面部分,导致频繁访问的数据页被淘汰2、冷热数据的比例是由innodb_old_blocks_pct控制的,默认373、第一次加载数据页到缓存页,是放到冷数据区域的头部,过了innodb_old_blocks_time时间之后,(默认是1000毫秒)冷数据区的数据再次被访问,才到被放到热数据区的头部。4、当冷数据区域有对象晋升时候如果热链表已满 则淘汰掉尾部的数据 但是要结合flush链表来判断是否需要刷盘 如果不需要则直接删除否则先刷盘再删除5、LRU热数据区的访问规则被优化了一下,只有在热数据区域的后3/4部分被访问,才会被移动到链表头部去,这样可以减少链表中的节点移动
索引页
线程
数据页头
6、准备提交事务binlog日志写入磁盘当sync_binlog=1的时候
key:表空间+数据页号value:缓存页地址
最大记录最小记录
数据页
热数据
数据页(大小16KB)
7、写入本次更更新对应的binlog的文件名称和更新在binlog文件中的位置用来保证binlog与redolog日志文件的一致
缓存页(16KB)
如果数据页被 缓存,直接返回缓存页中的额数据
存储引擎
header
body(写入一个一个的redo log)
trailer
数据页缓存哈希表(用来判断数据页是否被缓存)
磁盘文件
sql接口
当redo logbuffer的容量占据总容量的一半时,以及mysql关闭时,也会把redo log buffer中的redo log block写入redolog日志文件
关于buffer pool的配置优化,A、如果mysql内存大于1G,可以设置多个buffer pool,提高并发能力,比如8G内存,参数可以是innodb_buffer_pool_size = 8589934592innodb_buffer_pool_instances = 4B、优化流程-- 查询sizes show VARIABLES like \"%innodb_buffer_pool_size%\" -- 查询bufferpool个数 show VARIABLES like \"%innodb_buffer_pool_instances%\" -- 查询chunk大小 show VARIABLES like \"%innodb_buffer_pool_chunk_size%\
后台IO线程运行定时任务
sql解析器
mysql数据库服务器
每隔1秒钟将 redo log block刷入磁盘
连接
描述数据(冷数据)
将这些缓存页从flush链表中移除
bin log日志文件
多个数据行
文件头
执行器
数据页目录
4、记录redo log日志
2、写入数据的旧值便于回滚
空闲区域
1、要更新一行数据mysql找到这行数据所在的数据页加载到buffer pool里去
flush链表
当你的缓存页没有一个空闲的时候,你是不是要找出来那个最近最少被访问的缓存页去刷入磁盘?此时你就直接在LRU链表的尾部找到一个缓存页,他一定是最近最少被访问的那个缓存页!
描述数据(缓存页的地址,数据页编号,所属表空间等)相当于缓存页的5%,也就800多字节
undo log日志文件(用来回滚缓存页和redo log,当没有事务占用的时候会移除)
数据库连接池
默认可能会偏小,如果数据库是16核32G的机器,可以给bufferpool设置大小2Ginnodb_buffer_pool_size=2147483648
sql语句
执行计划
redolog buffer(redo log,用来记录你来你对数据做了什么修改)避免系统宕机
收藏
0 条评论
下一页