通過(guò)寶塔面板實(shí)現(xiàn)MySQL性能簡(jiǎn)單調(diào)優(yōu)
在PHP+MYSQL架構(gòu)網(wǎng)站運(yùn)行過(guò)程中,往往會(huì)遇到各種性能問(wèn)題影響,如MySQL、PHP、CPU、磁盤(pán)IO、緩存等,其中MySQL瓶頸就是最常見(jiàn)也最難解決的一種影響網(wǎng)站性能的因素;通常,我們會(huì)使用redis、memcached等緩存軟件來(lái)緩存內(nèi)容,這確實(shí)是最優(yōu)的解決方案之一,但這需要網(wǎng)站程序的支持,然而多數(shù)常用網(wǎng)站程序并不支持或者不能完美支持這些緩存軟件,今天我們就來(lái)談?wù)勅绾瓮ㄟ^(guò)MySQL自身的配置調(diào)整來(lái)優(yōu)化MySQL性能,以緩解MySQL瓶頸問(wèn)題。
準(zhǔn)備:
1、寶塔Linux面板 正式版 5.2.0+ (2017/09/20發(fā)布)測(cè)試版5.2.4+
2、MySQL 5.x
通常MySQL調(diào)優(yōu)我們分以下幾部分:
1、MySQL配置參數(shù)調(diào)優(yōu) (需要根據(jù)網(wǎng)站運(yùn)行情況調(diào)整)
2、數(shù)據(jù)表索引調(diào)優(yōu) (效果明顯,但通常優(yōu)秀的開(kāi)源程序都不需要調(diào)整)
3、SQL語(yǔ)句調(diào)優(yōu) (這是程序員或DBA干的事)
今天我們主要談?wù)勅绻浜蠈毸姘宓男鹿δ軄?lái)進(jìn)行MySQL配置參數(shù)調(diào)優(yōu),我們先來(lái)看兩張圖片:
(圖1)
(圖2)
很明顯,(圖1)顯示的是MySQL當(dāng)前的運(yùn)行狀態(tài),(圖2)顯示的是MySQL主要配置參數(shù)
下面我們就來(lái)解讀一下這兩張圖:
1、活動(dòng)/峰值連接數(shù)
(圖1)中當(dāng)前活動(dòng)的連接為1個(gè),自MySQL服務(wù)啟動(dòng)以來(lái),最高連接數(shù)為54;當(dāng)最高連接數(shù)接近或等于(圖2)中的max_connections時(shí),應(yīng)適當(dāng)增加max_connections,需要注意的是,不要一下子增加過(guò)多,建議每次增加50,觀察一段時(shí)間,不夠再繼續(xù)增加。
2、線程緩存命中率
(圖1)中線程緩存命中率為99.78%,若這個(gè)值小于90%,建議適當(dāng)增加(圖2)中的thread_cache_size,建議每次增加8。
3、索引命中率
(圖1)中索引命中率為99.50%,若這個(gè)值小于95%,建議適當(dāng)增加(圖2)中的key_buffer_size,建議每次增加64,需要說(shuō)明的是,若您的數(shù)據(jù)庫(kù)使用的是Innodb引擎,可忽略這個(gè)選項(xiàng)
4、Innodb索引命中率
(圖1)中Innodb索引命中率為100%,若這個(gè)值小于95%,建議適當(dāng)增加(圖2)中的innodb_buffer_pool_size,建議每次增加64,需要說(shuō)明的是,若您的數(shù)據(jù)庫(kù)沒(méi)有使用Innodb引擎,可忽略這個(gè)選項(xiàng)
5、查詢緩存命中率
MySQL查詢緩存是個(gè)比較受爭(zhēng)議的功能,個(gè)人建議當(dāng)你有在使用redis、memcached等緩存軟件時(shí),在(圖2)中將query_cache_size設(shè)為0可以將其關(guān)閉,當(dāng)你沒(méi)有使用緩存軟件,有多余的內(nèi)存使用,且數(shù)據(jù)庫(kù)瓶頸明顯存在時(shí),可以嘗試開(kāi)啟查詢緩存,這是個(gè)非常依賴數(shù)據(jù)表結(jié)構(gòu)及SQL語(yǔ)句優(yōu)化的功能,若數(shù)據(jù)表結(jié)構(gòu)和SQL語(yǔ)句都針對(duì)查詢緩存進(jìn)行過(guò)優(yōu)化,它的效果還是很不錯(cuò)的。
6、創(chuàng)建臨時(shí)表到磁盤(pán)
(圖1)中創(chuàng)建臨時(shí)表到磁盤(pán)的比例是0.42%,這說(shuō)明大部分臨時(shí)表創(chuàng)建到內(nèi)存了,不會(huì)過(guò)多增加磁盤(pán)IO的開(kāi)銷(xiāo),建議,當(dāng)比例大于2%時(shí)適當(dāng)增加(圖1)中的tmp_cache_size,建議每次增加32,當(dāng)比例大于60%時(shí),放棄吧,有些開(kāi)源程序并沒(méi)有專(zhuān)門(mén)優(yōu)化過(guò)SQL語(yǔ)句,所以在運(yùn)行過(guò)程中會(huì)開(kāi)啟大量臨時(shí)表,加多少緩存都是不夠用的。
7、已打開(kāi)的表
當(dāng)(圖1)中的已打開(kāi)的表接近或等于(圖2)中的table_open_cache時(shí),可以適當(dāng)增加table_open_cache,但若設(shè)置過(guò)大可能導(dǎo)致您的程序頻繁中斷MySQL連接,建議在1024以內(nèi),最大不要超過(guò)2048。
8、沒(méi)有使用索引的量、沒(méi)有使用索引的JOIN量
若不為0,就檢查下數(shù)據(jù)表索引吧,其實(shí)只要沒(méi)有瘋漲,比如一天增漲幾千,一般可以忽略,必竟優(yōu)化索引還是程序員或DBA去干比較合適。
9、排序后的合并次數(shù)
如果這個(gè)值在緩慢增張,建議適當(dāng)增加(圖2)中的sort_buffer_size,建議每次增加512,但最大不要超過(guò)8192,如果這個(gè)值一直在瘋漲,增加sort_buffer_size也沒(méi)用,就放棄這個(gè)選項(xiàng)吧,這個(gè)鍋還是給程序開(kāi)發(fā)者背。
10、鎖表次數(shù)
如果服務(wù)器CPU開(kāi)銷(xiāo)不大的情況下,瘋狂鎖表,建議你將所有數(shù)據(jù)表轉(zhuǎn)換成innodb,記得轉(zhuǎn)換前備份哦。
11、優(yōu)化方案
這個(gè)是我們根據(jù)內(nèi)存大小給的一個(gè)推薦優(yōu)化方案,僅是建議僅用于基礎(chǔ)參考值,還是要根據(jù)實(shí)據(jù)情況來(lái)調(diào)整每一個(gè)配置項(xiàng)。
注意:保存參數(shù)配置后不會(huì)立即生效,記得要重啟MySQL服務(wù)。