輕松優(yōu)化MySQL-之?dāng)?shù)據(jù)庫參數(shù)優(yōu)化

最佳實(shí)踐

使用InnoDB存儲引擎

InnoDB引擎已經(jīng)在多方面超越了MyIsam引擎,沒有特殊需求的情況下建議選擇InnoDB引擎邑闺。

讓InnoDB使用全部內(nèi)存

innodb_buffer_pool_size參數(shù)指定了 InnoDB 可以使用的內(nèi)存總量。
建議設(shè)置為物理內(nèi)存的 80%,因?yàn)橐o操作系統(tǒng)留有空間。
如果你的內(nèi)存是 32GB法褥,可以設(shè)置為大約 25GB

innodb_buffer_pool_size = 25600M

注意:
(1)如果值小于1GB,說明真的應(yīng)該升級服務(wù)器了
(2)如果內(nèi)存特別大酬屉,例如200gb半等,就不必給操作系統(tǒng)留 20% 了,因?yàn)镺S用不了 40gb呐萨。

讓InnoDB多實(shí)例

innodb_buffer_pool_size的值大于 1G時(shí)杀饵,innodb_buffer_pool_instances會把 InnoDB 的緩存池劃分成多個(gè)實(shí)例。
多個(gè)緩沖池的好處:
多個(gè)線程同時(shí)訪問緩沖池時(shí)可能會遇到瓶頸谬擦,而多個(gè)緩沖池則可以最小化這個(gè)沖突
官方建議的 buffer 數(shù)量:每個(gè) buffer pool 實(shí)例至少要 1G
例如內(nèi)存為 32GB切距,innodb_buffer_pool_size為 25GB,那么合適的方案就是 25600M / 24 = 1.06GB
innodb_buffer_pool_instances = 24

加大max_length_for_sort_data參數(shù)的設(shè)置

在MySQL中惨远,排序算法分為兩種谜悟,一是只加載排序字段到內(nèi)存,排序完成后再到表中取其他字段北秽,二是加載所有需要的字段到內(nèi)存葡幸,顯然第二種節(jié)省了IO操作,所以更快贺氓。決定使用哪種算法是通過參數(shù)max_length_for_sort_data來決定的蔚叨,當(dāng)所有返回字段的最大長度小于這個(gè)參數(shù)值時(shí),MySQL就會選擇第二種算法辙培,反之使用第一種蔑水。所以,如果有充足的內(nèi)存讓MySQL存放須要返回的非排序字段扬蕊,就可以加大這個(gè)參數(shù)的值來讓MySQL選擇第二種排序算法搀别。
當(dāng)內(nèi)存不是很充裕時(shí),不能簡單地通過強(qiáng)行加大上面的參數(shù)來強(qiáng)迫MySQL去使用高效算法尾抑,否則可能會造成MySQL不得不將數(shù)據(jù)分成很多段歇父,然后進(jìn)行排序,這樣可能會得不償失蛮穿,此時(shí)就須要去掉不必要的返回字段庶骄,讓返回結(jié)果長度適應(yīng)max_length_for_sort_data參數(shù)的限制。

增大sort_buffer_size參數(shù)設(shè)置

增大sort_buffer_size并不是為了讓 MySQL選擇第二種排序算法践磅,而是為了讓MySQL盡量減少在排序過程中對須要排序的數(shù)據(jù)進(jìn)行分段,因?yàn)榉侄螘斐蒑ySQL不得不使用臨時(shí)表來進(jìn)行交換排序灸异。

打開查詢緩存

充分利用Mysql的查詢緩存機(jī)制府适,業(yè)務(wù)中很多SQL都會重復(fù)執(zhí)行的羔飞,當(dāng)然現(xiàn)在很多數(shù)據(jù)層框架中也有緩存功能,但數(shù)據(jù)層框架中的緩存屬于應(yīng)用級別的檐春,在數(shù)據(jù)被外部更新時(shí)會導(dǎo)致緩存數(shù)據(jù)過期問題逻淌。

案例

發(fā)現(xiàn)網(wǎng)站頁面打開非常慢,對處理過程簡單記錄了一下疟暖。

找問題

首先登錄服務(wù)器使用 top 查看當(dāng)前進(jìn)程信息卡儒,發(fā)現(xiàn)排名第一的是 mysql,占用 cpu 達(dá)到了 100% 以上俐巴,這就明確了是 mysql 的問題骨望。
登錄 mysql,使用 show processlist 查看下當(dāng)前執(zhí)行狀態(tài)欣舵,發(fā)現(xiàn)了大量 LOCK 操作擎鸠,也有多個(gè) Copying to tmp table 的操作,說明有 sql 出現(xiàn)了問題缘圈,操作過于復(fù)雜劣光,對臨時(shí)表使用頻繁,把其他操作阻塞了糟把。

解決思路

找到了問題后绢涡,把處理方向確定為檢查和修改配置、sql優(yōu)化遣疯。

修改mysql配置

臨時(shí)表
既然涉及了到了臨時(shí)表垂寥,就先查看下目前臨時(shí)表的信息
查看臨時(shí)表的使用狀態(tài)

show global status like 'created_tmp%';

發(fā)現(xiàn) created_tmp_disk_tables 值過高,需要增加此值另锋。
再看一下現(xiàn)在臨時(shí)表的大小

show variables like '%tmp_table_size%';

在現(xiàn)在值的基礎(chǔ)上增加一些滞项,重新設(shè)置臨時(shí)表大小
線程緩存數(shù)
看當(dāng)前線程情況

show global status like 'Thread%';

發(fā)現(xiàn) threads_created 的值過大,表明MySQL服務(wù)器一直在創(chuàng)建線程
查看當(dāng)前值

show variables like 'thread_cache_size';

此參數(shù)需要調(diào)高
打開表數(shù)量
查看打開表的情況

show global status like 'open%tables%';

發(fā)現(xiàn) opened_tables 數(shù)量過大夭坪,說明 table_cache 的值可能太小文判。
查看當(dāng)前值

show variables like 'table_cache';

此參數(shù)需要調(diào)高
最大連接數(shù)
查看當(dāng)前允許的最大連接數(shù)

show variables like 'max_connections';

查看服務(wù)器連接數(shù)的峰值

show global status like 'Max_used_connections';

峰值還沒到最大限制,不需要修改
join buffer 和 sort buffer
查看現(xiàn)有值

SELECT @@sort_buffer_size;
SELECT @@join_buffer_size;

是默認(rèn)值室梅,需要修改
修改配置
確定了要修改的參數(shù)后戏仓,修改 my.cnf ,例如

table_cache = 64
sort_buffer_size = 8M
join_buffer_size = 4M
thread_cache_size = 300
thread_concurrency = 8
tmp_table_size = 246M

sql優(yōu)化

從 show processlist 結(jié)果集中找出主要的復(fù)雜語句亡鼠,對其進(jìn)行 explain 和 profile 分析赏殃,進(jìn)行索引優(yōu)化,把復(fù)雜的sql 根據(jù)業(yè)務(wù)拆分為多個(gè)小的sql间涵。

上一篇 《性能優(yōu)化系列文章目錄》 下一篇
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仁热,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子勾哩,更是在濱河造成了極大的恐慌抗蠢,老刑警劉巖举哟,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匿乃,死亡現(xiàn)場離奇詭異挣磨,居然都是意外死亡购笆,警方通過查閱死者的電腦和手機(jī)哩都,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門暖呕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來聋庵,“玉大人梨树,你說我怎么就攤上這事瓦呼∠澹” “怎么了庐椒?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長票堵。 經(jīng)常有香客問我扼睬,道長,這世上最難降的妖魔是什么悴势? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任窗宇,我火速辦了婚禮,結(jié)果婚禮上特纤,老公的妹妹穿的比我還像新娘军俊。我一直安慰自己,他們只是感情好捧存,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布粪躬。 她就那樣靜靜地躺著,像睡著了一般昔穴。 火紅的嫁衣襯著肌膚如雪镰官。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天吗货,我揣著相機(jī)與錄音泳唠,去河邊找鬼。 笑死宙搬,一個(gè)胖子當(dāng)著我的面吹牛笨腥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播勇垛,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼脖母,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了闲孤?” 一聲冷哼從身側(cè)響起谆级,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后哨苛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸽凶,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡币砂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年建峭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片决摧。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亿蒸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掌桩,到底是詐尸還是另有隱情边锁,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布波岛,位于F島的核電站茅坛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏则拷。R本人自食惡果不足惜贡蓖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望煌茬。 院中可真熱鬧斥铺,春花似錦、人聲如沸坛善。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眠屎。三九已至剔交,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間改衩,已是汗流浹背岖常。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留燎字,地道東北人腥椒。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像候衍,于是被迫代替她去往敵國和親笼蛛。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容