码迷,mamicode.com
首页 > 数据库 > 详细

关于MYSQL 和INNODB的逻辑关系图。最好的理解是一点点动手做,观察,记录,思考。

时间:2016-05-01 16:07:28      阅读:305      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

 

每隔0.1秒就刷一次MYSQL文件的变化,并闪动标示出来,以观察SQL执行时,MYSQL的处理顺序。

watch -n 0.1 -d stat /var/lib/mysql/ib_logfile0 /var/lib/mysql/ib_logfile1 /var/lib/mysql/ibdata1

 

 

我理解的执行顺序:(还缺插入缓冲的合并)很粗的框架理解,但折腾了许多天。

硬盘的数据文件mytable.ibd存有mytable这个表id=1的记录,name=123的。(innodb_per_file设置为on)

当UPDATE MYTABLE SET NAME=’ABC’ WHERE ID=1这个语句执行时,系统生成一个LSN是1

INNODB READ THREAD 将这条记录以及词典从硬盘中读到内存的数据页DATA PAGE中,并写到内存中一块UNDO BUFFER中。并对这条记录加锁(如果有索引就是行级锁,否则就是表锁)

INNODB WRITE THREAD将这条记录的UNDO日志写到UNDO表空间的回滚段中(默认是ibdata1文件中),

INNODB对数据页中的记录进行更新,变成脏页后,然后把LSN=1的这条日志,写进REDOLOG BUFFER;

到commit时,无论是显式还是隐式,根据innodb_flush_log_at_trx_commit指定的方式,刷新LSN到REDO LOG文件中,然后释放锁。这时PURGE THREAD就可以对UNDOLOG进行清理。PURGE是按事务号不按日志。

INNODB MASTER THREAD会择机把脏页刷写回数据文件mytable.ibd中。具体过程INNODB先把脏页的数据拷贝到内存池中一个DOUBLE WRITE BUFFER中,然后调用系统FSYNC()刷新系统缓存来确认真正写入了,然后再将脏页FLUSHD到对应的数据文件中mytable.idb后,释放脏页。

INNODB MASTER THREAD会择机已经写回数据文件的日志LSN,做为CHECKPOINT写进REDOLOG中。

 

技术分享

 

 

更直观性mysql整体逻辑机构图:

 技术分享

 

mysql sql执行过程示意图,对理解mysql执行计划有很大帮助

 

技术分享

当 ‘innodb_flush_log_at_trx_commit = x ’x=0,1,2 各值时刷盘机制

技术分享

mysql 内存分配示意图,对理解内存分配很有参考意义

技术分享

 

INNODB 内存与硬盘之间交互。 

技术分享

watch -n 0.1 -d stat /var/lib/mysql/ib_logfile0 /var/lib/mysql/ib_logfile1 /var/lib/mysql/ibdata1 

关于MYSQL 和INNODB的逻辑关系图。最好的理解是一点点动手做,观察,记录,思考。

标签:

原文地址:http://www.cnblogs.com/crossapply/p/5450507.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!