7、mysql innodb 底层原理

mysql主要分为Server层和存储引擎层

Server层包含连接器,查询缓存器,分析器,优化器,执行器,实现了数据库主要功能。

存储引擎层以插件式的架构将数据的存储和读取交给了插件处理。

innodb为mysql的一个默认存储引擎插件。数据读取与写入的并发情况,加锁方式,数据的存储结构都是引擎决定的,所以不同的引擎所支持的并发事务都不同。

undo log和redo log是innodb实现的,undo log用于实现事务的原子性 隔离性, redo log用于实现事务的持久性

连接器

与server进行连接的工具

查询缓存

mysql会把查询sql当作key缓存结果,在每次查询前检查是否有缓存。但每次有写入操作时,会清空所有缓存,所以命中率很低。

在8.0后查询缓存已被移出。

my.cnf

query_cache_type=2

0代表关闭查询缓存OFF,1代表开启ON,2(DEMAND)代表当sql语句中有SQL_CACHE关键词时才缓存

查询

show global variables like "%query_cache_type%";

分析器

经过词法分析、语法分析形成语法树

优化器

选择使用哪个索引, 或是全表扫描,多表join确定顺序等

数据更新逻辑

  1. 从ibd文件中找到要更新的那条数据,提取该数据存在的页数据放到buffer pool(内存)中。
  2. 将要修改之前的数据,存入到undo log,用于事务失败时回滚,以及其他事务查询(MVCC)。
  3. 将buffer pool中的数据按sql进行修改。
  4. 将修改后的数据存入到redo log buffer(内存),存的是物理修改项。
  5. 当事务提交后,将存入redo log buffer中的修改项,顺序写入到redo log(磁盘)中。
  6. 事务提交的同时,执行器将本次执行的sql语句写入到binlog(磁盘)中。
  7. binlog写入成功后,给redo log写入committed标记,判断redo log和binlog 都写入成功,事务成功; 若不一致则事务失败,开始回滚。
  8. buffer pool中的已被修改的数据,由于和ibd文件数据已经不一致了,被称为脏数据,等待io线程按整页刷入到磁盘。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值