广告
返回顶部
首页 > 资讯 > 数据库 >如何实现MYSQL和INNODB分层
  • 836
分享到

如何实现MYSQL和INNODB分层

2024-04-02 19:04:59 836人浏览 薄情痞子
摘要

如何实现Mysql和INNODB分层,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。open table 的时候 当初次open

如何实现Mysql和INNODB分层,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

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,
int mode,
uint test_if_locked)
)
这里完成了虚函数从写,也就完成了条件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

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, 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++多态的基础实现的。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网数据库频道,感谢您对编程网的支持。

您可能感兴趣的文档:

--结束END--

本文标题: 如何实现MYSQL和INNODB分层

本文链接: https://www.lsjlt.com/news/66160.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作