在mysql數(shù)據(jù)庫中,mysql key_buffer_size是對MyISAM表性能影響最大的一個參數(shù)(注意該參數(shù)對其他類型的表設(shè)置無效),下面就將對mysql Key_buffer_size參數(shù)的設(shè)置進(jìn)行詳細(xì)介紹下面為一臺以MyISAM為主要存儲引擎服務(wù)器的配置:
| mysql> show variables like 'key_buffer_size';+-----------------+------------+| Variable_name | Value |+-----------------+------------+| key_buffer_size | |+-----------------+------------+ |
分配了512MB內(nèi)存給mysql key_buffer_size,我們再看一下key_buffer_size的使用情況:
| mysql> show global status like 'key_read%';+------------------------+-------------+| Variable_name | Value |+------------------------+-------------+| Key_read_requests | | //從緩存讀取索引的請求次數(shù)。| Key_reads | | //從磁盤讀取索引的請求次數(shù)。+------------------------+-------------+ |
一共有27813678764個索引讀取請求,有6798830個請求在內(nèi)存中沒有找到直接從硬盤讀取索引,計算索引未命中緩存的概率:
| key_cache_miss_rate = Key_reads / Key_read_requests * 100% |
比如上面的數(shù)據(jù),key_cache_miss_rate為0.0244%,4000個索引讀取請求才有一個直接讀硬盤,已經(jīng)很BT了,key_cache_miss_rate在0.1%以下都很好(每1000個請求有一個直接讀硬盤),所以理論來上來說,這個比值越小越好,但過小的話,難免造成內(nèi)存浪費。
以上兩個值的比率固然能一部分的說明key_buffer_size是否合理,但僅僅以此就說明該值設(shè)置的合理的話,就過于偏激和片面了。因為這里忽略了兩個問題:
1、比例并不顯示數(shù)量的絕對值大小
2、計數(shù)器并沒有考慮時間因素
雖說Key_read_requests大比小好,但是對于系統(tǒng)調(diào)優(yōu)而言,更有意義的應(yīng)該是單位時間內(nèi)的Key_reads,即:
Key_reads / Uptime
具體查看方法如下:
| [root@web mysql]# mysqladmin ext -uroot -p -ri | grep Key_readsEnter password:| Key_reads | || Key_reads | || Key_reads | || Key_reads | || Key_reads | || Key_reads | || Key_reads | || Key_reads | || Key_reads | || Key_reads | | |
注:命令里的mysqladmin ext其實就是mysqladmin extended-status,你甚至可以簡寫成mysqladmin e。
其中第一行表示的是匯總數(shù)值,所以這里不必考慮,下面的每行數(shù)值都表示10秒內(nèi)的數(shù)據(jù)變化,從這份數(shù)據(jù)可以看出每10秒系統(tǒng)大約會出現(xiàn)500次Key_reads訪問,折合到每1秒就是50次左右,至于這個數(shù)值到底合理與否,就由服務(wù)器的磁盤能力而定了。(注:我這里之所以數(shù)據(jù)變化較大,是因為有update等語句造成了表鎖而導(dǎo)致下個時間段內(nèi)的查詢數(shù)猛增。)
為啥數(shù)據(jù)按10秒取樣,而不是直接按1秒取樣?由于時間段過小,數(shù)據(jù)變化比較劇烈,不容易直觀估計大小,所以通常數(shù)據(jù)按照10秒或者60秒之類的時間段來取樣是更好的。
新聞熱點
疑難解答
圖片精選