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

 

每隔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整体逻辑机构图:

 [转载]便于理解mysql内幕的各种逻辑图组

 

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

 

[转载]便于理解mysql内幕的各种逻辑图组

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

[转载]便于理解mysql内幕的各种逻辑图组

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

[转载]便于理解mysql内幕的各种逻辑图组

 

INNODB 内存与硬盘之间交互。 

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

posted @ 2016-05-01 14:45  一眼前望,一眼自省  阅读(1473)  评论(0编辑  收藏  举报