共計 1352 個字符,預計需要花費 4 分鐘才能閱讀完成。
丸趣 TV 小編給大家分享一下 MySQL 5.6 中 Table cache 是什么,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
一、Table
Cache
MySQL
5.6 后,引入了“table_cache_instances”參數來控制 table
cache instance 的個數。目前最大值是 64,默認值是 1。建議值是 16,當系統 CPU 核數高于 16 時。引入此參數的目的是,提高并發。相當于把 table
cache 拆成了多個分區,每個分區的打開 table 句柄數為:table_open_cache / table_open_cache_instances。跟 innodb_buffer_pool_instances 參數有異曲同工的作用。
table_cache_instances 的最大值為 64,每個 thread 會使用哪個 table cache
instance,根據 thread
id 取模得到:m_table_cache
[thread_id % table_cache_instances]。其中 m_table_cache 是 table cache 的 instance 分區數組。源碼定義如下:
Table
cache instance 統一由 Table_cache_manager 類來管理。Table_cache_manager 負責初始化和銷毀 table cache
instance。
另外,取代 LOCK_open 鎖的是 64 個 m_lock
mutex。因此大大降低了 table
cache 鎖的爭用,將其分攤到了 64 個 instance 上的 m_lock
mutex 上。
但是涉及到多個 table cache 中的對象的 DDL 語句,仍然需要整個 table cache 級別的鎖,即 Lock_open。另外,對所有 table cache
instances 以及 table
definition cache 上鎖時,也需持有 Lock_open 鎖。
二、Table cache Table definition cache
Table cache 與 Table
definition cache 是兩個概念完全不同的東西。
Table cache:也就是通常說的 table open
cache。存放當前已經打開的表句柄,與表創建時指定的存儲引擎相關。這塊在源碼上的體現是
table object 即有指向 table
share 的指針,也有指向具體存儲引擎的 handler 指針。
Table definition cache:存放表的定義信息。是 frm 文件在內存中的映射。MySQL 需要打開 frm 文件,并將其內容初始化為 Table Share
對象。這里存放與存儲引擎無關的,獨立的表定義相關信息。
為什么 MySQL 會出現這兩個概念是因為:MySQL 支持不同的存儲引擎,每種存儲引擎,數據存儲的格式都是不一樣的,因此需要指定一個存儲引擎相關的 handler。這就有了 table cache 的作用。另外表的定義也需要存放內存中,而表的定義 frm 文件每個存儲引擎是通用的,需要另外獨立開來,這就有了 table
definition cache。
看完了這篇文章,相信你對“MySQL 5.6 中 Table cache 是什么”有了一定的了解,如果想了解更多相關知識,歡迎關注丸趣 TV 行業資訊頻道,感謝各位的閱讀!