深入剖析MySQL数据库架构:核心组件、存储引擎与优化策略(二)

update语句的执行流程

增删改

缓存不太一样:buffer pool缓存区

mysql想完成数据的修改,会先从存储引擎层读取数据,把数据读取到服务层进行数据的修改,再通过存储引擎层把数据更新到数据库中。

mysql每次读取数据都会读取16384个字节的数据,默认是16KB的数据。一页的数据。

在innodb引擎中设计了 bufferpool 缓冲区。Mysql从磁盘中通过IO读取数据到buffer pool中,引擎从bffer pool中获取数据,然后修改,再把数据写入到buffer pool中。从而完成读写的操作,因为是基于内存的操作,所以速度是非常快的。

bufferpool防止大量的数据修改,数据库承受不了

刷盘操作

innodb存储引擎一张表产生两个物理文件。

脏数据:buffer pool中的数据,还没有同步到磁盘中的数据称为脏数据。

innodb的脏页刷新机制说明(3个状态):

1、当innodb中的脏页比例超过innodb_max_dirty_pages_pct_lwm的值时,这个时候innodb就会开始刷新脏页到磁盘。-----达到阈值,开始刷脏

2、当innodb中的脏页比例超过innodb_max_dirty_pages_pct_lwm的值,而且还超过innodb_max_dirty_pages_pct时innodb就会进入勤快刷新模式(agressively flush)这个模式下innodb会把脏页更快的刷新到磁盘。-----勤快的刷脏

3、还有一种情况叫做sharp checkpoint ,当innodb要重用它之前的redo文件时,就会把innodb_buffer_pool中所有与这个文件有关的页面都要刷新到磁盘;这样做就有可能引起磁盘的IO风暴了,轻者影响性能,重者影响可用性。----一直刷盘

对于控制刷新机制的各个参数的说明:

1、innodb_max_dirty_pages_pct默认值为75,也就是说当脏页比例超过75%时才会进入勤快刷新模式。

2、innodb_max_dirty_pages_pct_lwm默认值是0,0对于innodb_max_dirty_pages_pct_lwm来说是一个特殊值,它表示不启用这个功能;由于没有启用这个功能,也就是说innodb_buffer_pool中的脏页比例会操持在75%左右。

后台常用的线程:

master thread 主线程

IO thread IO操作的线程

Purge thread 清理数据和日志的线程

Page C1eaner thred 刷脏的线程

show VARIABLES like'%dirty_page%'; 查看关于脏页相关的配置。

查看buffer pool的大小,默认是128M

show VARIABLES like '%innodb_buffer_pool%';

数据存储到buffer pool中,默认是128M,如果buffer pool存满了,那么innodb引擎会使用改良的LRU算法清理数据。

注意:LRU算法是最近最久未使用法,mysql会对LRU的算法进行改良。

buffer pool不会自动清理,使用lru算法清理已经刷到磁盘上的数据。

冷热分离的方式。

问题:innodb引擎把数据存入到bufferpool中,如果还没来得及把数据刷新到磁盘上,这个时候数据库的服务挂掉了,那么数据就丢失了?mysql是如何解决这个问题的呢?-------日志(3个)

redo log 日志

为了解决该问题,mysql设计了redo log的日志,基于磁盘的方式存储的。

问题:数据没有直接存入到磁盘上,而是先存入到buffer pool中,然后再刷入磁盘,目的是为了性能考虑,但是现在有需要存入到redo log 日志的磁盘文件中,这样性能不就下降了?

答案:性能肯定是会有一些影响,但是需要保证数据可恢复的能力。写入redo log磁盘文件中的速度会更快一些。

随机磁盘IO和顺序磁盘IO的区别。

随机磁盘IO的情况是数据是会分散到不同的扇区去存储,因为底层是通过索引的顺序来存储,索引会存储到不同的扇区。那么更新数据的时候会增加寻道的时间,写入数据会变慢。

顺序磁盘IO是按着顺序追加写入的。

通过命令查看innodb_log相关的信息。

show VARIABLES like'%innodb_log%';

3重保障

悲观锁在数据被修改提交前,会先加上锁,防止其他事务对数据进行修改

乐观锁则是假设数据在使用过程中不会发生冲突,只在数据提交更新时检查是否有冲突

LRU算法---最长最久未使用的数据

改良的LRU算法:冷热数据,5/8放热数据,3/8放冷数据

热数据(双十一相关的数据)

先读到冷数据将需要的数据放到热数据中,优点:整页读取会读到不想要的数据

整页读取会读到不想要的数据,热数据会被删除,先要再次读取热数据时又需要访问IO流。

相关推荐
一米阳光86614 小时前
软考(中级)软件设计师核心笔记(3)数据库系统——概念、数据库设计
数据库·笔记·职场发展·软考·软件设计师
奈斯先生Vector4 小时前
告别工具碎片化:基于 Nano Banana 全模态 AI 聚合架构搭建“文本-图像-视频”自动化协同生产线
运维·数据库·人工智能·架构·自动化·aigc·音视频
建筑工程企业管理系统6 小时前
erp工程项目管理系统落地价值:实现工程多项目成本精细化核算与管控
大数据·数据库·人工智能
AI大模型-小华7 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
foolishlee7 小时前
Neon wal日志处理流程2
数据库
2601_965798478 小时前
Is Hygia Good for Maid & Janitorial Sites? Technical Audit
服务器·网络·数据库
Cloud云卷云舒8 小时前
海山数据库(HaishanDB)面向工业云场景技术方案
数据库·haishandb·工业云·移动云海山数据库·天工云
逃逸线LOF8 小时前
Spring配置数据源{连接池}(Druid、c3p0)
java·数据库·spring
严同学正在努力11 小时前
从备份到恢复:我用 30 分钟恢复了误删的核心业务表
android·java·数据库·ai
#六脉神剑11 小时前
myBuilder新版本(8月,Office文件预览、Oracle数据库支持)
数据库·oracle·开发平台·数字化工具·mybuilder