MYSQL和INNODB分層實現

gaopengtttt發表於2017-06-06
原創 水平有限

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


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++多型的基礎實現的。



作者微信:

               

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2140364/,如需轉載,請註明出處,否則將追究法律責任。

相關文章