MySQL 5.6下table_open_cache引數優化合理配置詳解
1、簡介
table_cache是一個非常重要的MySQL效能引數,它在5.1.3之後的版本中叫做table_open_cache。table_cache主要用於設定table快取記憶體的數量。由於每個客戶端連線都會至少訪問一個表,因此此引數的值與max_connections有關。
例如,對於 1000 個並行執行的連線,應該讓表的快取至少有 1000 × N ,這裡 N 是應用可以執行的查詢的一個聯接中表的最大數量。此外,還需要為臨時表和檔案保留一些額外的檔案描述符。
2、快取機制
當某一連線訪問一個表時,MySQL會檢查當前已快取表的數量。如果該表已經在快取中開啟,則會直接訪問快取中的表已加快查詢速度;如果該表未被快取,則會將當前的表新增進快取並進行查詢。
在執行快取操作之前,table_open_cache用於限制快取表的最大數目:如果當前已經快取的表未達到table_open_cache,則會將新表新增進來;若已經達到此值,MySQL將根據快取表的最後查詢時間、查詢率等規則釋放之前的快取。每當MySQL訪問一個表時,如果在表緩衝區中還有空間,該表就被開啟並放入其中,這樣可以更快地訪問表內容。
3、如何判斷
通過檢查峰值時間的狀態值Open_tables和Opened_tables,可以決定是否需要增加table_open_cache的值。
如果你發現open_tables等於table_open_cache,並且opened_tables在不斷增長,那麼你就需要增加 table_open_cache的值了(上述狀態值可以使用SHOW GLOBAL STATUS LIKE ‘Open%tables'獲得)。
注意,不能盲目地把table_open_cache設定成很大的值。如果設定得太高,可能會造成檔案描述符不足,從而造成效能不穩定或者連線失敗。
Open_tables / Opened_tables >= 0.85
Open_tables / table_cache <= 0.95
4、建議
如果開始沒有把握的話,把MySQL資料庫放在生產環境中試執行一段時間,然後把引數的值調整得比Opened_tables的數值大一些,並且保證在比較高負載的極端條件下依然比Opened_tables略大。
在mysql預設安裝情況下,table_cache的值在2G記憶體以下的機器中的值預設時256到 512,如果機器有4G記憶體,則預設這個值是2048,但這決意味著機器記憶體越大,這個值應該越大,因為table_cache加大後,使得mysql對 SQL響應的速度更快了,不可避免的會產生更多的死鎖(dead lock),這樣反而使得資料庫整個一套操作慢了下來,嚴重影響效能。所以平時維護中還是要根據庫的實際情況去作出判斷,找到最適合你維護的庫的 table_cache值。
mysql >flush tables; 可以將open_tables 清零
# service mysqld restart 可以講opened_tables 清零
以下是針對mysql 5.6的說明
table_open_cache指定表快取記憶體的大小。每當MySQL訪問一個表時,如果在表緩衝區中還有空間,該表就被開啟並放入其中,這樣可以更快地訪問表內容。
通過檢查峰值時間的狀態值Open_tables和Opened_tables,可以決定是否需要增加table_open_cache的值。
如果你發現open_tables等於table_open_cache,並且opened_tables在不斷增長,那麼你就需要增加table_open_cache的值了(上述狀態值可通過SHOW GLOBAL STATUS LIKE ‘Open%tables'獲得)。
注意,不能盲目地把table_open_cache設定成很大的值,設定太大超過了shell的檔案描述符(通過ulimit -n檢視),造成檔案描述符不足,從而造成效能不穩定或者連線失敗。
測試環境:騰訊雲CDB,記憶體4000M,在控制檯檢視到table_open_cache=512,監測table_open_cache設定是否合理,是否需要優化。
show variables like '%table_open_cache%';
show global status like 'Open%tables';
發現open_tables等於table_open_cache,都是512,說明mysql正在將快取的表釋放以容納新的表,此時可能需要加大table_open_cache的值,4G記憶體的機器,建議設定為2048
比較適合的值:
Open_tables / Opened_tables >= 0.85
Open_tables / table_open_cache <= 0.95
如果對此引數的把握不是很準,有個很保守的設定建議:把MySQL資料庫放在生產環境中試執行一段時間,然後把引數的值調整得比Opened_tables的數值大一些,並且保證在比較高負載的極端條件下依然比Opened_tables略大。