亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

如何實現MYSQL和INNODB分層

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

如何實現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, /*!< 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++多態的基礎實現的。

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

向AI問一下細節

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

AI

岳阳县| 四川省| 通城县| 花莲市| 任丘市| 鸡西市| 准格尔旗| 水城县| 五台县| 平塘县| 杭锦后旗| 丹江口市| 达日县| 凌源市| 宣城市| 台中县| 长治市| 馆陶县| 汤原县| 泰兴市| 西丰县| 绥棱县| 大兴区| 忻州市| 宣威市| 巴东县| 睢宁县| 乌恰县| 花垣县| 涡阳县| 洛隆县| 长乐市| 兴义市| 桦甸市| 崇左市| 密云县| 泰顺县| 东明县| 富蕴县| 鲜城| 乌拉特后旗|