InnoDB資料字典--字典表載入
1、介紹
在InnoDB啟動時,如果是新建資料庫則需初始化庫,需要建立字典管理的相關資訊。函式innobase_start_or_create_for_mysql呼叫dict_create完成此功能。即建立資料字典,因為InnoDB系統表的個數結構固定,所以初始化庫的時候只需要建立這幾個表的B+樹即可並將B+樹的根頁號存放到固定位置。對於B+樹,只要找到根頁面,就可以從根頁面開始檢索資料。相關係統表(即上一節講到的4個系統表)在InnoDB內部,不會暴露給使用者。
4個系統表透過固定的硬編碼進行構建。具體原理流程如下。
2、資料字典建立及載入原理流程
3、說明
1)innobase_start_or_create_for_mysql函式呼叫dict_create()函式進行資料字典的建立和載入工作。
2)dict_hdr_create完成系統表空間第7號頁面dict header的初始化及建立SYS_TABLES兩個索引、SYS_COLUMNS一個索引、SYS_INDEXES一個索引、SYS_FIELDS一個索引,其建立索引的函式是btr_create。
3)建立B+樹索引後,透過dict_boot函式載入常駐記憶體的4個系統表。具體流程見流程圖的②部分。
4)載入完成後,將這4個系統表掛在一個全域性字典中:
dict0dict.h::
點選(此處)摺疊或開啟
-
/* Dictionary system struct */
-
struct dict_sys_t{
-
ib_mutex_t mutex; /*!< mutex protecting the data
-
dictionary; protects also the
-
disk-based dictionary system tables;
-
this mutex serializes CREATE TABLE
-
and DROP TABLE, as well as reading
-
the dictionary data for a table from
-
system tables */
-
row_id_t row_id; /*!< the next row id to assign;
-
NOTE that at a checkpoint this
-
must be written to the dict system
-
header and flushed to a file; in
-
recovery this must be derived from
-
the log records */
-
hash_table_t* table_hash; /*!< hash table of the tables, based
-
on name */
-
hash_table_t* table_id_hash; /*!< hash table of the tables, based
-
on id */
-
ulint size; /*!< varying space in bytes occupied
-
by the data dictionary table and
-
index objects */
-
dict_table_t* sys_tables; /*!< SYS_TABLES table */
-
dict_table_t* sys_columns; /*!< SYS_COLUMNS table */
-
dict_table_t* sys_indexes; /*!< SYS_INDEXES table */
-
dict_table_t* sys_fields; /*!< SYS_FIELDS table */
-
-
/*=============================*/
-
UT_LIST_BASE_NODE_T(dict_table_t)
-
table_LRU; /*!< List of tables that can be evicted
-
from the cache */
-
UT_LIST_BASE_NODE_T(dict_table_t)
- table_non_LRU; /*!< List of tables that can
結構體中sys_tables、sys_columns、sys_indexes、sys_fields四個結構儲存上述對應的4個系統表。
結構體中HASH表及連結串列用來儲存InnoDB中的所有表的快取,包括系統表及使用者表。table_hash雜湊表按名字快取,table_id_hash按表ID進行hash,LRU連結串列用來管理表物件快取。
5)普通使用者表載入流程見流程圖的③、④部分。
當使用者訪問一個使用者表時,首先需要從表物件快取中查詢這個表的SHARE物件,如果找到則直接從其例項化表物件連結串列中拿一個使用;如果沒有找到,則需要重新開啟這個表,需要找到這個表的字典資訊。即③的流程。
具體載入一個表的字典是④流程,dict_load_table的工作。
a)首先需要找到SYS_TABLES表,也是先找快取,快取找不到再從系統表載入: dict_table_get_low
b)找到之後構建一個查詢鍵值,從SYS_TABLES的name主鍵索引進行查詢,如果誒呦找到或者該記錄已經被刪除則返回,否則解析找到的這條記錄。然後根據這些資訊建立表的記憶體物件table。
c)載入列操作與載入表的原理基本一樣,對應系統表的SYS_COLUMNS,聚集索引為(TABLE_ID,POS),查詢時,如果TABLE_ID相同,在POS從小到大排序,所以構造所有列的鍵值時,只需要透過TABLE_ID查詢即可,按順序取出所有列資訊一一構造記憶體物件。
d)載入索引資訊類似的流程
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31493717/viewspace-2152632/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- InnoDB資料字典詳解-系統表
- Oracle常用資料字典表Oracle
- Oracle 資料字典和資料字典檢視Oracle
- 資料字典
- 表空間的資料字典管理
- oracle資料字典表與檢視Oracle
- 【轉載】Oracle資料字典檢視Oracle
- 資料字典簡介和資料字典命中率
- ThinkCMF資料字典
- MySQL資料字典MySql
- oracle 資料字典Oracle
- Oracle 資料庫字典 檢視 基表Oracle資料庫
- 系統表和資料字典檢視
- 優化mysql資料字典表查詢優化MySql
- 類似資料字典的幾個表
- 資料字典和固定表統計資訊更新
- 檢視資料字典
- 淺析資料字典
- data dictionary(資料字典)
- 資料字典簡介
- Oracle常用資料字典Oracle
- oracle 資料字典(轉)Oracle
- Oracle資料字典 (轉)Oracle
- 生成oracle資料字典Oracle
- Oracle 資料字典 (轉)Oracle
- Oracle的資料字典Oracle
- MySQL 8.0 20個 InnoDB 及資料字典相關的新特性MySql
- 如何使用Hanlp載入大字典HanLP
- Oracle中的資料字典技術及常用資料字典總結Oracle
- InnoDB 層系統字典表 | 全方位認識 information_schemaORM
- Oracle 常用資料字典表、檢視的總結Oracle
- 通過修改資料字典,變更表的owner
- Oracle 常用資料字典檢視、表的總結Oracle
- 資料結構-字典樹資料結構
- MySQL 8.0 之資料字典MySql
- navicat生成mysql資料字典MySql
- oracle常用的資料字典Oracle
- Oracle 資料字典學習Oracle