The Table Cache
--------------------------------------------------------------------------------
表緩衝的對象:表
每個在緩衝中的對象 包含相關表 .frm檔案的解析結果,加上一些其它的資料。
準確地說,在對象裡的其它資料的內容依賴於表的儲存引擎。例如:
MyISAM,是表的資料和索引的檔案描述符。
Merge, 可能是多個檔案描述符,因為Merge表可以有很多的底層表。
--------------------------------------------------------------------------------
表緩衝特性:資源重用
例如:
當一個查詢請求訪問一張MyISAM表, MySQL 也許可以從緩衝的對象中擷取到檔案描述符。儘管這樣做可以避免開啟一個檔案描述符的開銷,但這個開銷其實並不大。開啟和關閉檔案描述符在本機存放區是很快的,伺服器可以輕鬆地完成每秒100萬次的操作。對MyISAM表來說,表緩衝的真正好處是:可以讓伺服器避免修改MyISAM檔案頭來標記表“正在使用中”。
--------------------------------------------------------------------------------
表緩衝-->InnoDB
表緩衝的設計是伺服器和儲存引擎之間分離不徹底的產物,屬於曆史問題。表緩衝對InnoDB重要性就小多了,因為InnoDB不依賴它來做那麼多的事(例如持有檔案描述符,InnoDB有自己的表緩衝版本)。儘管如此,InnoDB也能從緩衝解析的.frm檔案中獲益。
--------------------------------------------------------------------------------
Table Cache 參數的演變
在MySQL 5.1版本中及之後的版本,表緩衝分離成兩部分:
一個是開啟表的緩衝 ---> table_open_cache
一個是表定義的緩衝 ---> table_definition_cache
其結果是,表定義(解析.frm檔案的結果)從其它資源中分離出來了,例如表描述符。開啟的表依然是每個線程,每個表用的,但是表定義是全域的,可以被所有串連有效地共用。
通常可以把table_definition_cache 設定得足夠高,以緩衝所有的表定義。除非有上萬張表,否則這可能是最簡單的方法。
--------------------------------------------------------------------------------
參數的簡介:
Variable Name Variable Scope Dynamic Variable
table_open_cache Global Yes
table_definition_cache Global Yes
其中table_definition_cache預設值為400,取值範圍400-524288
--------------------------------------------------------------------------------
判斷參數是否需調整
如果Opened_tables狀態變數很大或者在增長,可能是因為表緩衝不夠大,那麼可以人為增加table_cache系統變數(或者是MySQL 5.1 中的table_open_cache)。然而,當建立和刪除暫存資料表時,要注意這個計數器的增長,如果經常需要建立和刪除暫存資料表,那麼該計數器就會不停地增長。www.bkjia.com
mysql> show status like 'Opened_files';
+---------------+------------+
| Variable_name | Value |
+---------------+------------+
| Opened_files | 1170770489 |
+---------------+------------+
--------------------------------------------------------------------------------
Table Cache 設定過大的缺點
把表緩衝設定過大的缺點:當伺服器有很多的MyISAM表時,可能會導致關機時間較長,因為關機前索引塊必須完成重新整理,表都必須標記為不再開啟。同樣的原因,也可能使FLUSH TABLES WITH READ LOCK操作花費很長一段時間。
--------------------------------------------------------------------------------
Table Cache 總結:
表緩衝實際上用的記憶體並不多,相反卻可以有效節約資源。雖然開啟一個新的表,相對於其他MySQL操作來說代價不算高,但它們的開銷是累加的。所以緩衝表有時可以提升效率。
--------------------------------------------------------------------------------
個人感覺:
對於,線上資料庫大多是MyISAM儲存引擎,應相應將table_open_cache的值調大些。
至於table_definition_cache, 看資料庫的table容量。
特此說明:個人感覺,純屬自己的觀點,自己的理解,僅供參考。