久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何實現MYSQL和INNODB分層

161次閱讀
沒有評論

共計 2328 個字符,預計需要花費 6 分鐘才能閱讀完成。

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

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

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

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-19發表,共計2328字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 嘉兴市| 石屏县| 昌乐县| 大化| 那曲县| 嵊泗县| 天津市| 方正县| 长丰县| 鲁山县| 宜兴市| 武安市| 通道| 湘潭市| 江源县| 精河县| 叙永县| 永城市| 旬邑县| 高青县| 理塘县| 保德县| 修水县| 长沙县| 工布江达县| 金秀| 沧州市| 九台市| 石城县| 灯塔市| 缙云县| 永济市| 忻州市| 浪卡子县| 化州市| 栾川县| 盱眙县| 新宾| 托里县| 恩平市| 佛教|