溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現(xiàn)MYSQL和INNODB分層

發(fā)布時間:2021-11-16 10:58:42 來源:億速云 閱讀:185 作者:柒染 欄目:MySQL數(shù)據(jù)庫

如何實現(xiàn)MYSQL和INNODB分層,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

open table 的時候 當初次open table的時候會生成一個table_shared結構體 這個結構體記錄
很多來自frm 的信息,基本就是表的定義,我們叫他為靜態(tài)緩存 換句話說這個東西整個mysql 一個
接口為get_table_share
然后會每個連接線程會打開這個表的時候會根據(jù)table_shared出來的信息建立一個table結構體
這個結構體是動態(tài)的,每個會話都會建立一個,他會將實際的信息傳遞到innodb 層次,
最后打開innodb 的表,當然這個動態(tài)的table結構體會在table shared中有鏈表用來連接。
接口為open_table_from_share
請自行參考運維內參第四章,這里簡單提了一下

這里主要說多態(tài)是怎么發(fā)生的。
多態(tài)成立3個條件
1、虛函數(shù)重寫
2、繼承
3、父類指針指向之類對象


1、
MYSQL層次和INNODB交互多態(tài)核心對象:
handler handler是基類,這個基類是在MYSQL層次的位于Handler.h中
ha_innobase: public handler  這個是繼承類來自于MYSQL的handler基類,他位于innodb層,在Ha_innodb.h中
這里完成條件


2、繼承這里以open為例
在handler類中有一個函數(shù)
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;
可以看到他是純虛函數(shù)
  我們在看看Ha_innodb.cc中有這樣的函數(shù)實現(xiàn)
  int
ha_innobase::open(
/*==============*/
const char* name, /*!< in: table name */
int mode, /*!< in: not used */
uint test_if_locked) /*!< in: not used */
)
這里完成了虛函數(shù)從寫,也就完成了條件1

3、
在TABLE類中有這樣一個句柄
handler *file;

在open_table_from_share會執(zhí)行
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為一個函數(shù)指針
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已經(jīng)指向了一個引擎層次的一個具體化的實例,這里完成條件3父類指針指向之類對象
也就是handler指針指向了ha_innobase

那么這里3個條件都已經(jīng)滿足,多態(tài)發(fā)生了

下面以open 為例,我們知道這個open函數(shù)在innodb 層次已經(jīng)虛函數(shù)重寫

在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))))
我們主要關注下這里的多態(tài)
我們知道ha_open實際會調用open,open在innodb層次已經(jīng)重寫,而outparam->file正是這樣一個
指針,他指向了innodb層的具體實例,當ha_open中執(zhí)行
if ((error=open(name,mode,test_if_locked)))
就已經(jīng)調用了innodb層次的ha_innobase::open,完成了層次的劃分,也是模塊的劃分。其實一切
都是以C/C++多態(tài)的基礎實現(xiàn)的。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI