數(shù)據(jù)庫(kù)Mysql性能優(yōu)化詳解
在mysql數(shù)據(jù)庫(kù)中,mysql key_buffer_size是對(duì)MyISAM表性能影響最大的一個(gè)參數(shù)(注意該參數(shù)對(duì)其他類型的表設(shè)置無(wú)效),下面就將對(duì)mysql Key_buffer_size參數(shù)的設(shè)置進(jìn)行詳細(xì)介紹下面為一臺(tái)以MyISAM為主要存儲(chǔ)引擎服務(wù)器的配置:
mysql> show variables like 'key_buffer_size'; +-----------------+------------+ | Variable_name | Value | +-----------------+------------+ | key_buffer_size | | +-----------------+------------+
分配了512MB內(nèi)存給mysql key_buffer_size,我們?cè)倏匆幌耴ey_buffer_size的使用情況:
mysql> show global status like 'key_read%'; +------------------------+-------------+ | Variable_name | Value | +------------------------+-------------+ | Key_read_requests | | //從緩存讀取索引的請(qǐng)求次數(shù)。 | Key_reads | | //從磁盤(pán)讀取索引的請(qǐng)求次數(shù)。 +------------------------+-------------+
一共有27813678764個(gè)索引讀取請(qǐng)求,有6798830個(gè)請(qǐng)求在內(nèi)存中沒(méi)有找到直接從硬盤(pán)讀取索引,計(jì)算索引未命中緩存的概率:
key_cache_miss_rate = Key_reads / Key_read_requests * 100%
比如上面的數(shù)據(jù),key_cache_miss_rate為0.0244%,4000個(gè)索引讀取請(qǐng)求才有一個(gè)直接讀硬盤(pán),已經(jīng)很BT了,key_cache_miss_rate在0.1%以下都很好(每1000個(gè)請(qǐng)求有一個(gè)直接讀硬盤(pán)),所以理論來(lái)上來(lái)說(shuō),這個(gè)比值越小越好,但過(guò)小的話,難免造成內(nèi)存浪費(fèi)。
以上兩個(gè)值的比率固然能一部分的說(shuō)明key_buffer_size是否合理,但僅僅以此就說(shuō)明該值設(shè)置的合理的話,就過(guò)于偏激和片面了。因?yàn)檫@里忽略了兩個(gè)問(wèn)題:
1、比例并不顯示數(shù)量的絕對(duì)值大小
2、計(jì)數(shù)器并沒(méi)有考慮時(shí)間因素
雖說(shuō)Key_read_requests大比小好,但是對(duì)于系統(tǒng)調(diào)優(yōu)而言,更有意義的應(yīng)該是單位時(shí)間內(nèi)的Key_reads,即:
Key_reads / Uptime
具體查看方法如下:
[root@web mysql]# mysqladmin ext -uroot -p -ri | grep Key_reads Enter password: | Key_reads | | | Key_reads | | | Key_reads | | | Key_reads | | | Key_reads | | | Key_reads | | | Key_reads | | | Key_reads | | | Key_reads | | | Key_reads | |
注:命令里的mysqladmin ext其實(shí)就是mysqladmin extended-status,你甚至可以簡(jiǎn)寫(xiě)成mysqladmin e。
其中第一行表示的是匯總數(shù)值,所以這里不必考慮,下面的每行數(shù)值都表示10秒內(nèi)的數(shù)據(jù)變化,從這份數(shù)據(jù)可以看出每10秒系統(tǒng)大約會(huì)出現(xiàn)500次Key_reads訪問(wèn),折合到每1秒就是50次左右,至于這個(gè)數(shù)值到底合理與否,就由服務(wù)器的磁盤(pán)能力而定了。(注:我這里之所以數(shù)據(jù)變化較大,是因?yàn)橛衭pdate等語(yǔ)句造成了表鎖而導(dǎo)致下個(gè)時(shí)間段內(nèi)的查詢數(shù)猛增。)
為啥數(shù)據(jù)按10秒取樣,而不是直接按1秒取樣?由于時(shí)間段過(guò)小,數(shù)據(jù)變化比較劇烈,不容易直觀估計(jì)大小,所以通常數(shù)據(jù)按照10秒或者60秒之類的時(shí)間段來(lái)取樣是更好的。
除些之外,我們還可以參考下key_blocks_*參數(shù):
mysql> show global status like 'key_blocks_u%'; +------------------------+-------------+ | Variable_name | Value | +------------------------+-------------+ | Key_blocks_unused | | | Key_blocks_used | | +------------------------+-------------+
Key_blocks_unused表示未使用的緩存簇(blocks)數(shù),Key_blocks_used表示曾經(jīng)用到的最大的blocks數(shù),比如這臺(tái)服務(wù)器,所有的緩存都用到了,要么增加key_buffer_size,要么就是過(guò)渡索引了,把緩存占滿了。比較理想的設(shè)置:
Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ 80%
筆者注:
查看簇(文件系統(tǒng)塊,block)的大?。ㄗ止?jié)數(shù))
Centos中有以下幾種方法:
#tune2fs /dev/sda1 | grep "block size"
#dumpe2fs /dev/sda1 | grep "block size"
理論上文件系統(tǒng)塊是扇區(qū)的倍數(shù)
mysqladmin是MySQL一個(gè)重要的客戶端,最常見(jiàn)的是使用它來(lái)關(guān)閉數(shù)據(jù)庫(kù),除此,該命令還可以了解MySQL運(yùn)行狀態(tài)、進(jìn)程信息、進(jìn)程殺死等。本文介紹一下如何使用mysqladmin extended-status(因?yàn)闆](méi)有"歧義",所以可以使用ext代替)了解MySQL的運(yùn)行狀態(tài)。
1. 使用-r/-i參數(shù)
使用mysqladmin extended-status命令可以獲得所有MySQL性能指標(biāo),即show global status的輸出,不過(guò),因?yàn)槎鄶?shù)這些指標(biāo)都是累計(jì)值,如果想了解當(dāng)前的狀態(tài),則需要進(jìn)行一次差值計(jì)算,這就是mysqladmin extended-status的一個(gè)額外功能,非常實(shí)用。默認(rèn)的,使用extended-status,看到也是累計(jì)值,但是,加上參數(shù)-r(--relative),就可以看到各個(gè)指標(biāo)的差值,配合參數(shù)-i(--sleep)就可以指定刷新的頻率,那么就有如下命令:
mysqladmin -uroot -r -i -pxxx extended-status +------------------------------------------+----------------------+ | Variable_name | Value | +------------------------------------------+----------------------+ | Aborted_clients | | | Com_select | | | Com_insert | | ...... | Threads_created | | +------------------------------------------+----------------------+
2. 配合grep使用
配合grep使用,我們就有:
mysqladmin -uroot -r -i -pxxx extended-status \ grep "Questions\|Queries\|Innodb_rows\|Com_select \|Com_insert \|Com_update \|Com_delete " | Com_delete | | | Com_delete_multi | | | Com_insert | | | Com_select | | | Com_update | | | Innodb_rows_deleted | | | Innodb_rows_inserted | | | Innodb_rows_read | | | Innodb_rows_updated | | | Queries | | | Questions | 2721 |
當(dāng)然,還可以配合awk等,筆者在這里就不一一介紹了,有情趣的朋友可以參考一下其它文檔。
相關(guān)文章
CentOS7下MySQL5.7安裝配置方法圖文教程(YUM)
這篇文章主要為大家詳細(xì)介紹了CentOS7下MySQL5.7安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
為什么MySQL分頁(yè)用limit會(huì)越來(lái)越慢
在mysql中l(wèi)imit可以實(shí)現(xiàn)快速分頁(yè),但是如果數(shù)據(jù)到了幾百萬(wàn)時(shí)我們的limit必須優(yōu)化才能有效的合理的實(shí)現(xiàn)分頁(yè)了,否則可能卡死你的服務(wù)器2021-07-07
MySQL存儲(chǔ)過(guò)程的查看與刪除實(shí)例講解
存儲(chǔ)過(guò)程存儲(chǔ)過(guò)程在創(chuàng)建之后,被保存在服務(wù)器上以供使用,直至被刪除,下面這篇文章主要給大家介紹了關(guān)于MySQL存儲(chǔ)過(guò)程的查看與刪除的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
sql中with?as用法以及with-as性能調(diào)優(yōu)/with用法舉例
SQL中的WITH?AS語(yǔ)法是一種強(qiáng)大的工具,可以簡(jiǎn)化復(fù)雜查詢的編寫(xiě),提高查詢的可讀性和維護(hù)性,這篇文章主要給大家介紹了關(guān)于sql中with?as用法以及with-as性能調(diào)優(yōu)/with用法的相關(guān)資料,需要的朋友可以參考下2024-01-01
MySQL中獲取當(dāng)前時(shí)間格式的方法匯總
在MySQL數(shù)據(jù)庫(kù)開(kāi)發(fā)中,獲取時(shí)間是一個(gè)常見(jiàn)的需求,MySQL提供了多種方法來(lái)獲取當(dāng)前日期、時(shí)間和時(shí)間戳,并且可以對(duì)時(shí)間進(jìn)行格式化、計(jì)算和轉(zhuǎn)換,以下是一些常用的MySQL時(shí)間函數(shù)及其示例,需要的朋友可以參考下2024-06-06
MySQL命令行方式進(jìn)行數(shù)據(jù)備份與恢復(fù)
本文主要介紹了MySQL命令行方式進(jìn)行數(shù)據(jù)備份與恢復(fù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08

