您好,登錄后才能下訂單哦!
如何實現(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è)資訊頻道,感謝您對億速云的支持。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。