一.key_buffer 上一篇瞭解key_buffer設置,key_buffer_size指定了索引緩衝區的大小,它決定索引處理的速度,尤其是索引讀的速度。通過檢查狀態值Key_read_requests和Key_reads,可以知道key_buffer_size設置是否合理。比例key_read ...
一.key_buffer
上一篇瞭解key_buffer設置,key_buffer_size指定了索引緩衝區的大小,它決定索引處理的速度,尤其是索引讀的速度。通過檢查狀態值Key_read_requests和Key_reads,可以知道key_buffer_size設置是否合理。比例key_reads /key_read_requests應該儘可能的低,至少是1:100,1:1000更好(理解為key_reads物理IO次數越少越好)。
-- 一共有Key_read_requests個索引請求,一共發生了Key_reads次物理IO SHOW GLOBAL STATUS LIKE '%key_read%';
-- Key_reads/Key_read_requests ≈ 0.1%以下比較好 SELECT 693206.0/94745304.0
key_buffer_size只對MyISAM表起作用。即使你不使用MyISAM表,但是內部的臨時磁碟表是MyISAM表,也要使用該值,可以使用檢查狀態值created_tmp_disk_tables得知詳情。
SHOW GLOBAL STATUS LIKE '%created_tmp_disk_tables%';
總結建議:
對於1G記憶體的機器,如果不使用MyISAM表,推薦值是16M(8-64M)。
單個key_buffer的大小不能超過4G。
建議key_buffer設置為物理記憶體的1/4(針對MyISAM引擎),在很多情況下數據要比索引大得多。
如果機器性能優越,可以設置多個key_buffer,分別讓不同的key_buffer來緩存專門的索引。
Key_reads/Key_read_requests的大小正常情況下得小於0.01。
二. table_cache (table_open_cache)
上面講了索引緩存,這裡講表緩存 table_cache,在mysql 5.1之後叫做"table_open_cache"。這個參數表示資料庫用戶打開表的緩存數量(最大限制數),用於設置table高速緩存的數量。由於每個客戶端連接都會至少訪問一個表,因此此參數的值與max_connections有關。例如 對於200個並行運行的連接,應該讓表的緩存至少有200 * N。這裡N是可以執行的查詢的一個連接中表的最大數量(表數量)。
表緩存機制是:當某一連接訪問一個表時,MySQL會檢查當前已緩存表的數量。如果該表已經在緩存中打開,則會直接訪問緩存中的表已加快查詢速度;如果該表未被緩存,則會將當前的表添加進緩存併進行查詢。
在執行緩存操作之前,table_cache用於限制緩存表的最大數目:如果當前已經緩存的表未達到table_cache,則會將新表添加進來;若已經達到此值,MySQL將根據緩存表的最後查詢時間、查詢率等規則釋放之前的緩存(釋放機制與sqlserver一樣)。
-- 表緩存限制數(預設是2000次) SHOW VARIABLES LIKE 'table_open_cache';
-- 最大併發連接數 SHOW VARIABLES LIKE 'max_connections';
可以通過檢查mysqld的狀態變數open_tables和opened_tables確定table_cache參數是否過小。 open_tables表示當前打開的表緩存數,如果執行flush tables操作,則系統會關閉一些當前沒有使用的表緩存,而使得些狀態值減小。opened_tables表示曾經打開的表緩存數(歷史的),會一直進行累加。執行flush tables值不會減少。
-- 當前打開的表緩存數 SHOW GLOBAL STATUS LIKE 'open_tables';
-- 曾經打開的表緩存數 SHOW GLOBAL STATUS LIKE 'opened_tables';
2.1演示下open_tables和opened_tables值的變化(在另一臺mysql上進行)
第一步:
-- 清空表緩存 FLUSH TABLES; -- 查看值為1(代表當前連接) SHOW GLOBAL STATUS LIKE 'open_tables';
-- 歷史值為111 SHOW GLOBAL STATUS LIKE 'opened_tables';
第二步:
-- 執行一個查詢 SELECT COUNT(1) FROM User1 -- 再次查詢當前緩存數 SHOW GLOBAL STATUS LIKE 'open_tables';
--歷史值也累加到113 SHOW GLOBAL STATUS LIKE 'opened_tables';
第三步:
-- 再執行一個相同查詢, 會發現值沒有增加,因為讀的是緩存。 SELECT COUNT(1) FROM User1 SHOW GLOBAL STATUS LIKE 'open_tables';
SHOW GLOBAL STATUS LIKE 'opened_tables';
三. 修改table_cache值
下麵來嘗試修改table_cache值, 還是一樣找到my.cnf
[root@xuegod64 etc]# vim my.cnf
[root@xuegod64 ~]# systemctl stop mysqld.service
[root@xuegod64 ~]# /bin/systemctl start mysqld.service
-- 服務停止重啟後再次查看表緩存限制數。 SHOW VARIABLES LIKE 'table_open_cache';
四.table_cache總結
open_tables是當前表緩存數,類似於sql server的邏輯查詢而非物理查詢。 該open_tables的值對設置table_cache值有重要的參考價值。
如果Open_tables的值已經接近table_cache的值,且Opened_tables還在不斷變大,則說明mysql正在將緩存的表釋放以容納新的表,此時可能需要加大table_cache的值。下麵這台mysql伺服器正是這種情況,1990接近最大限制2000,且歷史值還在不斷變大。 如下圖:
比較適合的值建議:
Open_tables / Opened_tables >= 0.85
當前mysql的值:SELECT 1990.0/3286078.0=0.00061
Open_tables / table_cache <= 0.95
當前mysql的值:1990.0/2000.0=0.99500