MyISAM中key_buffer_size的設定
一直以來,多數人在使用MyISAM時都是按照增大Key_read_requests / Key_reads的原則來設定key_buffer_size的,沒想到這竟然是錯誤的!
Key_read_requests和Key_reads就是兩個計數器,它們的含義如下:
Key_read_requests:從緩存讀取索引的請求次數。
Key_reads:從磁盤讀取索引的請求次數。
通常人們認為Key_read_requests / Key_reads越大越好,否則就應該增大key_buffer_size的設定,但通過計數器的比例來調優有兩個問題:
問題一:比例并不顯示數量的絕對值大小
問題二:計數器并沒有考慮時間因素
雖說Key_read_requests大比小好,但是對于系統調優而言,更有意義的應該是機關時間内的Key_reads:
Key_reads / Uptime
你可以通過指令行得到一個實時的資料結果,比如:
# mysqladmin ext -ri10 | grep Key_reads
| Key_reads | 83777189 |
| Key_reads | 211 |
| Key_reads | 177 |
| Key_reads | 202 |
提示:指令裡的mysqladmin ext其實就是mysqladmin extended-status,你甚至可以簡寫成mysqladmin e。
其中第一行表示的是彙總數值,是以這裡不必考慮,下面的每行數值都表示10秒内的資料變化,從這份資料可以看出每10秒系統大約會出現200次Key_reads通路,折合到每1秒就是20次左右,至于這個數值到底合理與否,就由伺服器的磁盤能力而定了。
順便說一句,為啥資料按10秒取樣,而不是直接按1秒取樣?這裡看看按1秒的結果:
# mysqladmin ext -ri1 | grep Key_reads
| Key_reads | 83776743 |
| Key_reads | 7 |
| Key_reads | 7 |
| Key_reads | 38 |
可以看到,由于時間段過小,資料變化比較劇烈,不容易直覺估計大小,是以通常資料按照10秒或者60秒之類的時間段來取樣是更好的。
忘記:Key_read_requests / Key_reads
牢記:Key_reads / Uptime