在進行MySQL的優化以前,必需要了解的就是MySQL的查詢過程,不少查詢優化工做實際上就是遵循一些原則,讓MySQL的優化器可以按照預想的合理方式運行而已。html
圖-MySQL查詢過程linux
注:優化有風險,涉足需謹慎ios
一、優化可能帶來的問題?sql
·優化不老是對一個單純的環境進行,還極可能是一個複雜的已投產的系統;數據庫
·優化手段原本就有很大的風險,只不過你沒能力意識到和預見到;安全
·任何的技術能夠解決一個問題,但必然存在帶來一個問題的風險;服務器
·對於優化來講解決問題而帶來的問題,控制在可接受的範圍內纔是有成果;網絡
·保持現狀或出現更差的狀況都是失敗!架構
2.優化的需求?併發
· 穩定性和業務可持續性,一般比性能更重要;
· 優化不可避免涉及到變動,變動就有風險;
· 優化使性能變好,維持和變差是等機率事件;
· 切記優化,應該是各部門協同,共同參與的工做,任何單一部門都不能對數據庫進行優化!
· 因此優化工做,是由業務須要驅使的!
3.優化由誰參與?
在進行數據庫優化時,應由數據庫管理員、業務部門表明、應用程序架構師、應用程序設計人員、應用程序開發人員、硬件及系統管理員、存儲管理員等,業務相關人員共同參與。
1.優化什麼?
在數據庫優化上有兩個主要方面:即安全與性能。
· 安全->數據可持續性;
· 性能->數據的高性能訪問。
2.優化的範圍有哪些?
存儲、主機和操做系統方面:
· 主機架構穩定性;
· I/O規劃及配置;
· Swap交換分區;
· OS內核參數和網絡問題。
應用程序方面:
· 應用程序穩定性;
· SQL語句性能;
· 串行訪問資源;
· 性能欠佳會話管理;
· 這個應用適不適合用MySQL。
數據庫優化方面:
· 內存;
· 數據庫結構(物理&邏輯);
· 實例配置。
說明:不論是設計系統、定位問題仍是優化,均可以按照這個順序執行。
3優化維度?
數據庫優化維度有四個:
硬件、系統配置、數據庫表結構、SQL及索引。
優化選擇:
· 優化成本:硬件>系統配置>數據庫表結構>SQL及索引。
· 優化效果:硬件<系統配置<數據庫表結構<SQL及索引。
1.數據庫層面?
檢查問題經常使用工具:
不經常使用但好用的工具:
關於Zabbix參考:
http://www.cnblogs.com/clsn/p/7885990.html
2.數據庫層面問題解決思路?
通常應急調優的思路:針對忽然的業務辦理卡頓,沒法進行正常的業務處理,須要立馬解決的場景。
常規調優思路:
針對業務週期性的卡頓,例如在天天10-11點業務特別慢,可是還可以使用,過了這段時間就行了。
3.系統層面?
Cpu方面:
內存:
IO設備(磁盤、網絡):
vmstat命令說明:
iostat命令說明:
4.系統層面問題解決辦法?
你認爲到底負載高好,仍是低好呢?在實際的生產中,通常認爲Cpu只要不超過90%都沒什麼問題。
固然不排除下面這些特殊狀況:
Cpu負載高,IO負載低:
IO負載高,Cpu負載低:
IO和cpu負載都很高:
1.優化思路?
定位問題點吮吸:硬件-->系統-->應用-->數據庫-->架構(高可用、讀寫分離、分庫分表)。
處理方向:明確優化目標、性能和安全的折中、防患未然。
2.硬件優化?
主機方面:
CPU的選擇:
內存的選擇:
存儲方面:
網絡設備方面:
注意:以上這些規劃應該在初始設計系統時就應該考慮好。
3.服務器硬件優化?
4.系統優化?
Cpu:
內存:
SWAP:
IO :
Swap調整(不使用swap分區)
這個參數決定了Linux是傾向於使用swap,仍是傾向於釋放文件系統cache。在內存緊張的狀況下,數值越低越傾向於釋放文件系統cache。
固然,這個參數只能減小使用swap的機率,並不能避免Linux使用swap。
修改MySQL的配置參數innodb_flush_ method,開啓O_DIRECT模式:
這種狀況下,InnoDB的buffer pool會直接繞過文件系統cache來訪問磁盤,可是redo log依舊會使用文件系統cache。
值得注意的是,Redo log是覆寫模式的,即便使用了文件系統的cache,也不會佔用太多。
IO調度策略:
永久修改
5.系統參數調整?
Linux系統內核參數優化:
用戶限制參數(MySQL能夠不設置如下配置):
6.應用優化?
業務應用和數據庫應用獨立;
防火牆:iptables、selinux等其餘無用服務(關閉):
安裝圖形界面的服務器不要啓動圖形界面runlevel 3。
另外,思考未來咱們的業務是否真的須要MySQL,仍是使用其餘種類的數據庫。用數據庫的最高境界就是不用數據庫。
SQL優化方向:執行計劃、索引、SQL改寫。
架構優化方向:高可用架構、高性能架構、分庫分表。
1.數據庫參數優化?
調整
實例總體(高級優化,擴展):
鏈接層(基礎優化)
設置合理的鏈接客戶和鏈接方式:
SQL層(基礎優化)
2.存儲引擎層(innodb基礎優化參數)?
歡迎工做一到五年的Java工程師朋友們加入Java填坑之路:860113 481 羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用本身每一分每一秒的時間來學習提高本身,不要再用"沒有時間「來掩飾本身思想上的懶惰!趁年輕,使勁拼,給將來的本身一個交代!