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中,這個變數被分為兩部...