在進(jìn)行MySQL的優(yōu)化之前,必須要了解的就是MySQL的查詢過(guò)程,很多查詢優(yōu)化工作實(shí)際上就是遵循一些原則,讓MySQL的優(yōu)化器能夠按照預(yù)想的合理方式運(yùn)行而已。 圖-MySQL查詢過(guò)程 1.優(yōu)化的哲學(xué)注:優(yōu)化有風(fēng)險(xiǎn),涉足需謹(jǐn)慎 a.優(yōu)化可能帶來(lái)的問(wèn)題? · 優(yōu)化不總是對(duì)一個(gè)單純的環(huán)境進(jìn)行,還很可能是一個(gè)復(fù)雜的已投產(chǎn)的系統(tǒng); · 優(yōu)化手段本來(lái)就有很大的風(fēng)險(xiǎn),只不過(guò)你沒(méi)能力意識(shí)到和預(yù)見(jiàn)到; · 任何的技術(shù)可以解決一個(gè)問(wèn)題,但必然存在帶來(lái)一個(gè)問(wèn)題的風(fēng)險(xiǎn); · 對(duì)于優(yōu)化來(lái)說(shuō)解決問(wèn)題而帶來(lái)的問(wèn)題,控制在可接受的范圍內(nèi)才是有成果; · 保持現(xiàn)狀或出現(xiàn)更差的情況都是失??! b.優(yōu)化的需求? · 穩(wěn)定性和業(yè)務(wù)可持續(xù)性,通常比性能更重要; · 優(yōu)化不可避免涉及到變更,變更就有風(fēng)險(xiǎn); · 優(yōu)化使性能變好,維持和變差是等概率事件; · 切記優(yōu)化,應(yīng)該是各部門(mén)協(xié)同,共同參與的工作,任何單一部門(mén)都不能對(duì)數(shù)據(jù)庫(kù)進(jìn)行優(yōu)化! 所以優(yōu)化工作,是由業(yè)務(wù)需要驅(qū)使的! c.優(yōu)化由誰(shuí)參與? 在進(jìn)行數(shù)據(jù)庫(kù)優(yōu)化時(shí),應(yīng)由數(shù)據(jù)庫(kù)管理員、業(yè)務(wù)部門(mén)代表、應(yīng)用程序架構(gòu)師、應(yīng)用程序設(shè)計(jì)人員、應(yīng)用程序開(kāi)發(fā)人員、硬件及系統(tǒng)管理員、存儲(chǔ)管理員等,業(yè)務(wù)相關(guān)人員共同參與。 2.優(yōu)化思路a.優(yōu)化什么? 在數(shù)據(jù)庫(kù)優(yōu)化上有兩個(gè)主要方面:即安全與性能。 · 安全->數(shù)據(jù)可持續(xù)性; · 性能->數(shù)據(jù)的高性能訪問(wèn)。 b.優(yōu)化的范圍有哪些? 存儲(chǔ)、主機(jī)和操作系統(tǒng)方面: · 主機(jī)架構(gòu)穩(wěn)定性; · I/O規(guī)劃及配置; · Swap交換分區(qū); · OS內(nèi)核參數(shù)和網(wǎng)絡(luò)問(wèn)題。 應(yīng)用程序方面: · 應(yīng)用程序穩(wěn)定性; · SQL語(yǔ)句性能; · 串行訪問(wèn)資源; · 性能欠佳會(huì)話管理; · 這個(gè)應(yīng)用適不適合用MySQL。 數(shù)據(jù)庫(kù)優(yōu)化方面: · 內(nèi)存; · 數(shù)據(jù)庫(kù)結(jié)構(gòu)(物理&邏輯); · 實(shí)例配置。 說(shuō)明:不管是設(shè)計(jì)系統(tǒng)、定位問(wèn)題還是優(yōu)化,都可以按照這個(gè)順序執(zhí)行。 c.優(yōu)化維度? 數(shù)據(jù)庫(kù)優(yōu)化維度有四個(gè): 硬件、系統(tǒng)配置、數(shù)據(jù)庫(kù)表結(jié)構(gòu)、SQL及索引。 優(yōu)化選擇: · 優(yōu)化成本:硬件>系統(tǒng)配置>數(shù)據(jù)庫(kù)表結(jié)構(gòu)>SQL及索引。 · 優(yōu)化效果:硬件<系統(tǒng)配置<數(shù)據(jù)庫(kù)表結(jié)構(gòu)<SQL及索引。 3.優(yōu)化工具有啥?a.數(shù)據(jù)庫(kù)層面? 檢查問(wèn)題常用工具: 不常用但好用的工具: 關(guān)于Zabbix參考: b.數(shù)據(jù)庫(kù)層面問(wèn)題解決思路? 一般應(yīng)急調(diào)優(yōu)的思路:針對(duì)突然的業(yè)務(wù)辦理卡頓,無(wú)法進(jìn)行正常的業(yè)務(wù)處理,需要立馬解決的場(chǎng)景。 常規(guī)調(diào)優(yōu)思路:針對(duì)業(yè)務(wù)周期性的卡頓,例如在每天10-11點(diǎn)業(yè)務(wù)特別慢,但是還能夠使用,過(guò)了這段時(shí)間就好了。 c.系統(tǒng)層面? Cpu方面: 內(nèi)存: IO設(shè)備(磁盤(pán)、網(wǎng)絡(luò)): vmstat命令說(shuō)明: iostat命令說(shuō)明: d.系統(tǒng)層面問(wèn)題解決辦法? 你認(rèn)為到底負(fù)載高好,還是低好呢?在實(shí)際的生產(chǎn)中,一般認(rèn)為Cpu只要不超過(guò)90%都沒(méi)什么問(wèn)題。 當(dāng)然不排除下面這些特殊情況: Cpu負(fù)載高,IO負(fù)載低: IO負(fù)載高,Cpu負(fù)載低: IO和cpu負(fù)載都很高: 4.基礎(chǔ)優(yōu)化 a.優(yōu)化思路? 定位問(wèn)題點(diǎn)吮吸:硬件-->系統(tǒng)-->應(yīng)用-->數(shù)據(jù)庫(kù)-->架構(gòu)(高可用、讀寫(xiě)分離、分庫(kù)分表)。 處理方向:明確優(yōu)化目標(biāo)、性能和安全的折中、防患未然。 b.硬件優(yōu)化? 主機(jī)方面: CPU的選擇: ![]() 內(nèi)存的選擇: 存儲(chǔ)方面: ![]() 網(wǎng)絡(luò)設(shè)備方面: 注意:以上這些規(guī)劃應(yīng)該在初始設(shè)計(jì)系統(tǒng)時(shí)就應(yīng)該考慮好。 c.服務(wù)器硬件優(yōu)化? ![]() d.系統(tǒng)優(yōu)化? Cpu: 內(nèi)存: SWAP: IO : Swap調(diào)整(不使用swap分區(qū)) 這個(gè)參數(shù)決定了Linux是傾向于使用swap,還是傾向于釋放文件系統(tǒng)cache。在內(nèi)存緊張的情況下,數(shù)值越低越傾向于釋放文件系統(tǒng)cache。 當(dāng)然,這個(gè)參數(shù)只能減少使用swap的概率,并不能避免Linux使用swap。 修改MySQL的配置參數(shù)innodb_flush_ method,開(kāi)啟O_DIRECT模式: 這種情況下,InnoDB的buffer pool會(huì)直接繞過(guò)文件系統(tǒng)cache來(lái)訪問(wèn)磁盤(pán),但是redo log依舊會(huì)使用文件系統(tǒng)cache。 值得注意的是,Redo log是覆寫(xiě)模式的,即使使用了文件系統(tǒng)的cache,也不會(huì)占用太多。 IO調(diào)度策略: 永久修改 ![]() e.系統(tǒng)參數(shù)調(diào)整? Linux系統(tǒng)內(nèi)核參數(shù)優(yōu)化: ![]() 用戶限制參數(shù)(MySQL可以不設(shè)置以下配置): ![]() f.應(yīng)用優(yōu)化? 業(yè)務(wù)應(yīng)用和數(shù)據(jù)庫(kù)應(yīng)用獨(dú)立; 防火墻:iptables、selinux等其他無(wú)用服務(wù)(關(guān)閉): ![]() 安裝圖形界面的服務(wù)器不要啟動(dòng)圖形界面runlevel 3。 另外,思考將來(lái)我們的業(yè)務(wù)是否真的需要MySQL,還是使用其他種類的數(shù)據(jù)庫(kù)。用數(shù)據(jù)庫(kù)的最高境界就是不用數(shù)據(jù)庫(kù)。 5.數(shù)據(jù)庫(kù)優(yōu)化SQL優(yōu)化方向:執(zhí)行計(jì)劃、索引、SQL改寫(xiě)。 架構(gòu)優(yōu)化方向:高可用架構(gòu)、高性能架構(gòu)、分庫(kù)分表。 a.數(shù)據(jù)庫(kù)參數(shù)優(yōu)化? 調(diào)整 實(shí)例整體(高級(jí)優(yōu)化,擴(kuò)展): ![]() 連接層(基礎(chǔ)優(yōu)化) 設(shè)置合理的連接客戶和連接方式: ![]() SQL層(基礎(chǔ)優(yōu)化) ![]() b.存儲(chǔ)引擎層(innodb基礎(chǔ)優(yōu)化參數(shù))? ![]() 歡迎工作一到五年的Java工程師朋友們加入Java填坑之路:860113481 群內(nèi)提供免費(fèi)的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)、高性能及分布式、Jvm性能調(diào)優(yōu)、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個(gè)知識(shí)點(diǎn)的架構(gòu)資料)合理利用自己每一分每一秒的時(shí)間來(lái)學(xué)習(xí)提升自己,不要再用'沒(méi)有時(shí)間“來(lái)掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來(lái)的自己一個(gè)交代! |
|
來(lái)自: 昵稱16619343 > 《科學(xué)技術(shù)》