Mysql的执行流程

查询语句是怎么执行的:

局部性原理:

时间局部性和空间局部性
数据和程序都有聚集成群的倾向
之前被读取过的数据有可能很快被下一次读取

磁盘预读:

如果珑需要读以一个字付a,从磁盘中,是奥的只取了一个字符吗?
​
内存跟磁盘在进行数据交互的时候由一个最基本的逻辑单元,称之为页,或者叫datapage,不同的操作系统页的大小是不同的,一般是4k,或者8k,每次在进行读取的时候需要读取4k的整数倍
​
innodb存储引擎默认读取的是16kb的数据

Mysql的架构是一个单线程,多进程的模式

Inner DB的内存和磁盘结构

交互式/非交互式时间查询

查看连接:show global status like '%Threads%';

 

show global variables like 'wait_timeout'; (非交互式超时时间,如JDBC程序)

show global variables like 'interactive_timeout';(交互式超时时间,如数据库工具)

默认连接数量151,最大连接数量100000(V5.7)

缓存  : show variables like 'query_cache%'; 

不推荐开启,因为Mysql缓存很鸡肋,如果一张表里的任意一行数据发生变化,整张表的缓存都会失效,浪费资源,建议使用专业的缓存工具如Redis

show variables like 'datadir'; 查看mysql位置

Mysql数据库的引擎再5.5.5之前是My ISAM ,之后才改为InnoDB,建表时默认InnoDB

不同的数据引擎再磁盘中存储的方式也不同

Buffer Pool(内存缓冲池)

首先将数据加载到Buffer Pool中,假如要对某一条数据进行修改,这个数据刚好在数据页中,就把这个数据页加载到Buffer Pool中,Buffer Pool对应的叫缓存页,每个缓存页有一个元数据信息,就是缓存页的描述信息,占用缓存页的5%(16K* 5% = 800多字节)左右资源,元数据描述信息也会占用内存,所以Buffer Pool的内存会比128M大

Buffer Pool还没有同步到磁盘中的数据叫"脏页",将脏页数据同步到磁盘文件的动作叫"刷脏"

show variables like '%innodb_buffer_pool%'; (查看Buffer Pool大小),默认128M ,企业中可能会设置到机器内存的80%

如果Buffer Pool满了 ,会有内存淘汰机制LRU

原生LRU策略:淘汰链表末尾的数据

Buffer Pool对LRU策略进行了改良,将LRU分为两块

数据链表

free链表 :管理Buffer Pool的空闲区域

flush链表:记录Buffer Pool中的脏页

数据update后,当前页变为脏页,会记录到flush链表上,MySQL后台线程会定时查找flush链表并同步控制块记录的页数据到磁盘 (刷脏)

lru链表:记录Buffer Pool中有数据的页,后进来的加载链表的头部 越是靠前的控制块数据,就是最近使用的数据,(访问数据后,数据页对应的控制块会移动到lru链表的最前边) 假如Buffer Pool满了,就会淘汰lru链表尾部的控制块对应的数据页

全表扫描会替换Buffer Pool中的热数据 

更新语句执行流程: 

  • 从存储引擎拿到数据,记录到Buffer Pool 执行一遍查询,进一步返回给Sercer

  • 修改记录 ,这时会去内存中修改数据

  • 调用存储引擎,记录到Buffer Pool

  • 日志 redo log ,undo log

  • 事务提交

主从复制:

主节点负责写,从节点不能被操作,从节点负责读,

主从同步:

通过bin log 保持主从复制

更新语句执行流程图解:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值