• ADADADADAD

    如何实现MYSQL和INNODB分层[ mysql数据库 ]

    mysql数据库 时间:2024-11-26 22:11:38

    作者:文/会员上传

    简介:

    open table 的时候 当初次open table的时候会生成一个table_shared结构体 这个结构体记录很多来自frm 的信息,基本就是表的定义,我们叫他为静态缓存 换句话说这个东西整个mysq

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。

    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 */
    intmode,/*!< in: not used */
    uinttest_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++多态的基础实现的。

    如何实现MYSQL和INNODB分层.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: innodbmysql