共计 2328 个字符,预计需要花费 6 分钟才能阅读完成。
如何实现 MYSQL 和 INNODB 分层,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面丸趣 TV 小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
open table 的时候 当初次 open table 的时候会生成一个 table_shared 结构体 这个结构体记录
很多来自 frm 的信息,基本就是表的定义,我们叫他为静态缓存 换句话说这个东西整个 mysql 一个
接口为 get_table_share
然后会每个连接线程会打开这个表的时候会根据 table_shared 出来的信息建立一个 table 结构体
这个结构体是动态的,每个会话都会建立一个,他会将实际的信息传递到 innodb 层次,
最后打开 innodb 的表,当然这个动态的 table 结构体会在 table shared 中有链表用来连接。
接口为 open_table_from_share
请自行参考运维内参第四章,这里简单提了一下
这里主要说多态是怎么发生的。
多态成立 3 个条件
1、虚函数重写
2、继承
3、父类指针指向之类对象
1、
MYSQL 层次和 INNODB 交互多态核心对象:
handler handler 是基类,这个基类是在 MYSQL 层次的位于 Handler.h 中
ha_innobase: public handler 这个是继承类来自于 MYSQL 的 handler 基类,他位于 innodb 层,在 Ha_innodb.h 中
这里完成条件
2、继承这里以 open 为例
在 handler 类中有一个函数
handler::ha_open,他里面调用了方法 open 比如
if ((error=open(name,mode,test_if_locked)))
那么这里我们看看 open 在 MYSQL 层次中的定义为
virtual int open(const char *name, int mode, uint test_if_locked)=0;
可以看到他是纯虚函数
我们在看看 Ha_innodb.cc 中有这样的函数实现
int
ha_innobase::open(
/*==============*/
const char* name, /*! in: table name */
int mode, /*! in: not used */
uint test_if_locked) /*! in: not used */
)
这里完成了虚函数从写,也就完成了条件 1
3、
在 TABLE 类中有这样一个句柄
handler *file;
在 open_table_from_share 会执行
outparam- file= get_new_handler(share, outparam- mem_root,share- db_type()))) //db_type 引擎类型 db_plugin /* storage engine plugin */
if ((file= db_type- create(db_type, share, alloc)))
file- init();
DBUG_RETURN(file);
这里的指针是 db_type- create 返回的值,这里的 db_type 为 innobase,这里 db_type- create 为一个函数指针
handler *(*create)(handlerton *hton, TABLE_SHARE *table, MEM_ROOT *mem_root);
他指向了
handler* innobase_create_handler(handlerton* hton, /*! in: InnoDB handlerton */ TABLE_SHARE* table,MEM_ROOT* mem_root)
通过这里 outparam- file 已经指向了一个引擎层次的一个具体化的实例,这里完成条件 3 父类指针指向之类对象
也就是 handler 指针指向了 ha_innobase
那么这里 3 个条件都已经满足,多态发生了
下面以 open 为例,我们知道这个 open 函数在 innodb 层次已经虚函数重写
在 open_table_from_share 的最后会实际的打开表
if ((ha_err= (outparam- file-
ha_open(outparam, share- normalized_path.str,
(db_stat HA_READ_ONLY ? O_RDONLY : O_RDWR),
(db_stat HA_OPEN_TEMPORARY ? HA_OPEN_TMP_TABLE :
(db_stat HA_WAIT_IF_LOCKED) ?
HA_OPEN_WAIT_IF_LOCKED :
(db_stat (HA_ABORT_IF_LOCKED | HA_GET_INFO)) ?
HA_OPEN_ABORT_IF_LOCKED :
HA_OPEN_IGNORE_IF_LOCKED) | ha_open_flags))))
我们主要关注下这里的多态
我们知道 ha_open 实际会调用 open,open 在 innodb 层次已经重写,而 outparam- file 正是这样一个
指针,他指向了 innodb 层的具体实例,当 ha_open 中执行
if ((error=open(name,mode,test_if_locked)))
就已经调用了 innodb 层次的 ha_innobase::open,完成了层次的划分,也是模块的划分。其实一切
都是以 C /C++ 多态的基础实现的。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注丸趣 TV 行业资讯频道,感谢您对丸趣 TV 的支持。