Buffer pool--mysql详解(八)

2023-02-08 00:00:00 数据 事务 缓存 磁盘 链表

上篇文章说了,show warning可以看到mysql优化器的结果,执行计划的详解,select type的种类,有派生,物化,子查询,连接查询等。

Mysql在访问数据的时候,并不是每次从磁盘的系统表空间查询,而是会缓存到内存,这个内存我们就称为buffer pool,可以通过innoDB buffer pool size来设置,默认是128m。

Buffer pool如何管理内存里的页呢,于是有一些表空间编号,页号,缓存页,lsn值等。

Free链表:当mysql服务器启动的时候,就会申请buffer pool,当系统还没有数据进入buffer pool的时候,这时候都是free 链表,当有数据进入的时候,会从free链表取空闲的缓存页。

Flush链表:当数据开始修改到内存的时候,发现内存和磁盘书就不一致,这时候总不能每次修改一点就刷新到磁盘,于是有了flush链表,又称为脏页,当系统正常关机的时候会刷新到磁盘,系统空闲的时候也会刷新到磁盘,当buffer pool内存不足的时候也会把数据刷新到磁盘。

Lru链表:当内存数据越来越多,我们需要把不需要的数据从缓存移除,这时候lru链表就出现了。

于是lru链表为了提高缓存命中率,使用频率高的数据就称为热数据,young区域,使用频率低的数据则是冷区域,old区域。可以通过innodb_old_blocks_pct参数来设置两个区域的占比,默认是37。innodb_old_blocks_time默认是1000ms,通过这两个参数来解决mysql的预读和全盘扫描。Mysql次读取数据线放入old区域,后面会先移除,1000ms之内再次访问,才会把数据移动到young区域。

所以总是那个所述,刷新数据到磁盘会通过lru链表和flush链表来实现。

Buffer pool的数量可以通过innodb_buffer_pool_instances来设置大小,并不是越多越好,当内存大小小于1个g的时候默认是一个,设置是的。

我们可以通过show engine innodb status来查看buffer pool 的状态。

事务简介(ACID)

原子性(Atomicity):保证在一个事务里的操作要么全部执行成功,要么全部执行失败。

隔离性(Isolation):当两个修改同时操作数据库的时候,保证不会交叉影响,分开读取和修改来保证隔离性。

一致性(Consistency):一个事务作为一个原子在事务里独立运行,直到事务结束,也必须再次一致,一致的条件不限于数据库主键约束和check约束,还需要业务代码来实现,新增和扣减必须是一致的。

持久化(Durability):当数据发生改变的时候,会记录到mysql数据库磁盘上,这个过程就叫做持久化。

上面就是事务的简介,当满足上述条件时候,就叫做事务(transaction)。

在事务里大致有五个状态:活动的(active)、部分提交的(partially commited')、失败的(failed)、中止的(aborted)、提交的(committed)。当事务发生错误失败后,则会回滚之后进入中止状态。

事务不光能全部回滚,还能用savapoint 来保存保存点,后面rollback to保存点。

相关文章