MySQL表定義快取

2022-03-26 05:23:01 字數 1693 閱讀 9304

mysql的表包含表名,表空間、索引、列、約束等資訊,這些表的元資料我們暫且稱為表定義資訊。 對於innodb來說,mysql在server層和engine層都有表定義資訊。server層的表定義記錄在frm檔案中,而innodb層的表定義資訊儲存在innodb系統表中。例如:

innodb_sys_datafiles   

innodb_sys_tablestats

innodb_sys_indexes

innodb_sys_fields

innodb_sys_tablespaces

innodb_sys_foreign_cols

innodb_sys_foreign

innodb_sys_tables

innodb_sys_columns

注:以上都是memory表,它們內容是從實際系統表中獲取的。實際上innodb系統表engine也是innodb型別的,資料也是以b樹組織的。

在資料庫每次執行sql都會訪問表定義資訊,如果每次都從frm檔案或系統表中獲取,效率會較低。因此mysql在server層和innodb層都有表定義的快取。以mysql 5.6為例,引數table_definition_cache控制了表定義快取中表的個數,server層和innodb層的表定義快取共用此引數。

server層表定義為table_share物件,table_share物件有引用計數和版本資訊,每次使用flush操作會遞增版本資訊。 server層表定義快取由hash表和old_unused_share鍊錶組成,通過hash表table_def_cache以表名為key快取table_share物件,同時未使用的table_share物件通過old_unused_share鍊錶鏈結。

old_unused_share鍊錶調整:

innodb表定義為dict_table_t, 快取為dict_sys_t,結構如下

struct dict_sys_t;
主要由hash表和lru鍊錶組成。

1. 將最近使用的表放入lru頭部(`dict_move_to_mru`)

每次按name和id查詢時都會調整,參考`dict_table_open_on_name`和`dict_table_open_on_id`。

2. lru的淘汰

* 淘汰哪些表

lru中表才可以淘汰,table\_non\_lru中的表不參入淘汰。

表引用計數必須為0(`table->n_ref_count == 0`)。

表的索引被自適應雜湊引用計數必須為0(`btr_search_t->ref_count=0`)。

* 何時淘汰

主線程控制每47(srv\_master\_dict\_lru\_interval)秒檢查一次,只遍歷一半lru鍊錶。

主線程空閒時檢查一次,但掃所有lru鍊錶,清理控制快取表個數不能超過table\_definition\_cache。

* 如何淘汰

從lru尾部開始,淘汰滿足條件表(`dict_make_room_in_cache`)。

注:

table_non_lru沒有實際作用,主要用於debug;

如果有較多引用約束的表,它們不受lru管理,引數table_definition_cache的作用會弱化。

mysql 表定義 MySQL的表定義語法

mysql 資料庫mysql的表定義語法 表定義只有成功建立資料庫後,才能建立資料表,資料表是字段的集合,在表中資料按行和列的格式儲存 建立表mysql 使用 create table 建立表。其中有多個選擇,主要由表建立定義 create definition 表選項定義 table option...

mysql表結構定義 mysql表定義語法詳細介紹

首先我們都知道只有成功建立資料庫後,才能建立資料表,資料表是字段的集合,在表中資料按行和列的格式儲存。建立表mysql 使用 create table 建立表。其中有多個選擇,主要由表建立定義 create definition 表選項定義 table options 和區分選項 partition...

mysql執行緒快取和表快取

一.執行緒快取 1.thread cache size定義了執行緒緩衝中的數量.每個快取中的執行緒通常消耗256kb記憶體 2.threads cached,可以看到已經建立的執行緒 二.表快取 table cache 1.表快取有點以myisam為中心 2.在mysql5.1中,這個變數被分為兩部...