InnoDB 线程与内存池以及如何实现事务

innerdb 是有线程与内存池组成

一,数据库事务的实现机制(当然实际之中会更复杂)
1,undo 是将所有未实现的 commint 事务回滚到之前状态,典型的 undolog
假设有A、B两个数据,值分别为1,2。 进行+2的事务操作。
A.事务开始.
B.记录A=1到undo log(可以理解为旧的数据进行备份).
C.修改A=3.
D.记录B=2到undo log.
E.修改B=4.
F.将undo log写到磁盘。
G.将数据写到磁盘。
H.事务提交

Redo Log记录的是新数据的备份 在事务提交前,只要将Redo Log持久化即可,不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是Redo Log已经持久化。系统可以根据Redo Log的内容,将所有数据恢复到最新的状态。
Undo + Redo事务的简化过程
A.事务开始.
B.记录A=1到undo log.
C.修改A=3.
D.记录A=3到redo log(更新的数据).
E.记录B=2到undo log(记录数据).
F.修改B=4.
G.记录B=4到redo log.
H.将redo log写入磁盘。
I.事务提交

二,数据库线程介绍,
1,线程访问内存池,负责刷新内存池的之中的数据,保证内存池之中的数据时最近的数据.
2,线程实现办证数据库异常的情况之下,innodb可以恢复到正常的水平.
3,线程分类:
1,Master Thread 核心线程,负责内存池的数据刷新,保证最近的数据状态
2,IO Thread 处理io请求,主要是由 read,write,insert buffer,log io thread 组成
4,Purge Thread 主要是处理回收 undo 页 ,减轻 Master Thread 线程的压力
5,Page Cleaner Thread 将处理脏页的(脏页的刷新),减轻 Master Thread 线程的压力

三,数据库内存池介绍
1,由于数据库的cpu操作与io操作相差太多,因此mysql 使用的缓冲池的技术.
2,数据库修改操作,是首先修改的是缓存池之中的数据(如果有),然后在以一定的频率刷新到磁盘之上(也是提高数据库整体性的机制).
3,对于缓冲池数据的管理时使用了改进的LRU(最近少使用),将最新的数据放置最前面,缓冲池满的话,删除最后面的数据。
4,改进的部分是,不是放置最前面,放置LRU列表的6/8(可以更改)处.也是为了处理索引或者数据扫描造成的问题
#查看 innodb 版本信息
show variables like 'innodb_version';
#查看 io线程的信息
show variables like 'innodb_%io_threads';
#查看 innodb 线程的状态
show engine innodb status;
#查看缓冲池信息
show variables like 'innodb_buffer_pool_size';

 

posted @ 2018-08-18 10:35  十七楼的羊  阅读(189)  评论(0编辑  收藏  举报