table_open_cache參數表示數據庫打開表的緩存數量,即表的高速緩存。每個連接進來,都會至少打開一個表緩存。例如,對于 200 個并行運行的連接,應該讓表的緩存至少有 200 × N ,這里 N 是應用可以執行的SQL語句中所需要表的最大數量。此外,還需要為臨時表和文件保留一些額外的文件描述符。

當 Mysql 訪問一個表時,如果該表在緩存中已經被打開,則可以直接訪問緩存;如果還沒有被緩存,但是在 Mysql 表緩沖區中還有空間,那么這個表就被打開并放入表緩沖區;如果表緩存滿了,則會按照一定的規則將當前未用的表釋放,或者臨時擴大表緩存來存放,使用表緩存的好處是可以更快速地訪問表中的內容。也就是說MySQL每打開一個表,都會讀入一些數據到tabe_open_cache緩存中,當mysq在這個緩存中找不到相應的信息時,才會去磁盤上直接讀取。

wKiom1cgKGeDU9r_AAAO46VpTkc136.png

open函數參數?

一般來說,可以通過查看數據庫運行峰值時間的狀態值 open_tables 和 opened_tables ,判斷是否需要增加 table_open_cache 的值(其中open_tables 是當前打開的表的數量, opened_tables 則是已經打開的表的數量)。

wKioL1cgJHfitZcFAAAd6SnOdE0141.png


MySQL High memory utilization?我們再打開一個表,可以看到open_tables 和 opened_tables都加了1.

wKioL1cgJhijm-jQAAAzHUL4Pgk889.png


我們可以使用flush tables來關閉一些當前沒有使用的表緩存,使open_tables數值降低。我們可以看到open_tables減少到1,而opened_tables并沒有減少。所以在實際使用中open_tables屬性更有參考價值。

table,wKiom1cgJ2vTOr2YAAAhu-N33RI378.png




參數調優:

MySQL case when、如果open_tables接近table_cache的時候,并且opened_tables這個值在逐步增加,那就要考慮增加這個值的大小了。還有就是table_locks_waited比較高的時候,也需要增加table_open_cache。如果open_tables的值已經接近table_open_cache的值,且opened_tables還在不斷變大,則說明mysql正在將緩存的表釋放以容納新的表,此時可能需要加大table_open_cache的值。

如果對此參數的把握不是很準,VPS管理百科給出一個很保守的設置建議:把MySQL數據庫放在生產環境中試運行一段時間,然后把參數的值調整得比opened_tables的數值大一些,并且保證在比較高負載的極端條件下依然比opened_tables略大。在mysql默認安裝情況下,table_open_cache的值在2G內存以下的機器中的值默認時256到 512,如果機器有4G內存,則默認這個值是2048,但這決意味著機器內存越大,這個值應該越大,因為table_open_cache加大后,使得mysql對SQL響應的速度更快了,不可避免的會產生更多的死鎖(dead lock),這樣反而使得數據庫整個一套操作慢了下來,嚴重影響性能。所以平時維護中還是要根據庫的實際情況去作出判斷,找到最適合你維護的庫的table_open_cache值。


本文大部分文字資料來自于:http://www.cnblogs.com/suredandan/p/4010931.html

宏命令opentable?