Innodb的代码相对于mysql server层代码漂亮多了,风格统一,逻辑清晰,而且模块划分得很好:
srv_sys
log_sys
trx_sys
lock_sys
dict_sys
recv_sys
btr_search_sys
fil_system
读代码时可以按照子模块(子系统)来各个击破
本文介绍最后一个子模块:fil_system,材料基本是读代码时记下的一些笔记,出于分享和整理的想法,把它写成了一篇博文
fil_system是在内存中维护的表文件/表空间信息,对应的数据结构是fil_system_t,其对象全局只有一个: fil_system,与其相关的数据结构有fil_space_t和fil_node_t
fil_space_t代表一个表空间(tablespace),Innodb在将innodb_file_per_table设置为1时会为每个innodb表创建一个独立的表空间(table_name.idb),否则所有的表共享系统表空间(ibdata1)
fil_node_t代表某个表空间中的一个文件,可以是表数据/索引数据/日志数据
数据库管理了多个表空间,因而fil_system_t与fil_space_t是一对多的关系,fil_system_t中使用两个hash table(分别以id和name作为key)和两个list维护了表空间(其中一个list只维护了存在脏数据所有表空间),同时,fil_system_t维护了所有打开的fil_node_t的LRU链表
fil_space_t与fil_node_t也是一对多的关系,fil_space_t维护了内存中打开的所有fil_node_t的一个链表,因此fil_node_t中有两个UT_LIST_NODE_T(fil_node_t)成员,fil_system_t维护LRU,fil_space_t维护chain,为了更加直观的表达它们之间的联系,画了一张图:
阅读(3889) | 评论(0) | 转发(0) |