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
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++多型的基礎實現的。
作者微信:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL innodb 事務的實現MySql
- MySQL中InnoDB儲存引擎的實現和執行原理MySql儲存引擎
- 基於MySql主從分離的程式碼層實現MySql
- mysql索引底層實現MySql索引
- MySQL索引底層實現原理MySql索引
- MySQL怎麼實現主從同步和Django實現MySQL讀寫分離MySql主從同步Django
- 搞懂MySQL InnoDB事務ACID實現原理MySql
- MYSQL INNODB中hash查詢表的實現MySql
- 【MYSQL】innodb兩次寫(double write)實現解析MySql
- Promise的分層解析及實現Promise
- MySQL Join的底層實現原理MySql
- 深入理解 MySQL 底層實現MySql
- MySQL innodb 事務的實現(看書筆記)MySql筆記
- InnoDB索引實現索引
- MySQL實現分組排序MySql排序
- mysql儲存引擎InnoDB詳解,從底層看清InnoDB資料結構MySql儲存引擎資料結構
- mysql事務和鎖InnoDBMySql
- MySQL/InnoDB和Group CommitMySqlMIT
- MySQL/InnoDB和GroupCommit(2)MySqlMIT
- MySQL之儲存引擎InnoDB和MyISAM的區別及底層詳解MySql儲存引擎
- MYSQL INNODB 中通用雙向連結串列的實現MySql
- MySQL主從分離實現MySql
- 淘寶TDDL——Matrix層的分庫分表配置與實現
- 『淺入淺出』MySQL 和 InnoDBMySql
- MySQL InnoDB Update和Crash Recovery流程MySql
- 分離mysql和儲存實現雙web負載均衡MySqlWeb負載
- MySQL5.7在InnoDB層做的一些效能優化和新的特性MySql優化
- Minya 分層框架實現的思考(三):問題框架
- torch--多層感知機實現影像分類
- ProxySQL實現MySQL讀寫分離MySql
- Amoeba 實現 MySQL 讀寫分離MySql
- InnoDB行鎖實現方式
- Mysql innodb引擎(一)緩衝和索引MySql索引
- Mysql 中 MyISAM 和 InnoDB 的區別MySql
- mysql innodb_log_file_size 和innodb_log_buffer_size引數MySql
- InnoDB索引與底層原理索引
- KVO的使用和底層實現原理
- 分層架構和SOA架構