深入剖析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流。

相关推荐
.Eyes1 小时前
OceanBase 分区裁剪(Partition Pruning)原理解读
数据库·oceanbase
MrZhangBaby2 小时前
SQL-leetcode— 2356. 每位教师所教授的科目种类的数量
数据库
一水鉴天2 小时前
整体设计 之定稿 “凝聚式中心点”原型 --整除:智能合约和DBMS的在表层挂接 能/所 依据的深层套接 之2
数据库·人工智能·智能合约
翔云1234563 小时前
Python 中 SQLAlchemy 和 MySQLdb 的关系
数据库·python·mysql
孙霸天3 小时前
Ubuntu20系统上离线安装MongoDB
数据库·mongodb·ubuntu·备份还原
Java 码农3 小时前
nodejs mongodb基础
数据库·mongodb·node.js
TDengine (老段)3 小时前
TDengine IDMP 运维指南(4. 使用 Docker 部署)
运维·数据库·物联网·docker·时序数据库·tdengine·涛思数据
TDengine (老段)3 小时前
TDengine IDMP 最佳实践
大数据·数据库·物联网·ai·时序数据库·tdengine·涛思数据
彬彬醤4 小时前
Mac怎么连接VPS?可以参考这几种方法
大数据·运维·服务器·数据库·线性代数·macos·矩阵
废喵喵呜4 小时前
达梦数据库-实时主备集群部署详解(附图文)手工搭建一主一备数据守护集群DW
网络·数据库·tcp/ip