大牛是怎麼思考設計SQL優化方案的?

在進行MySQL的優化以前,必需要了解的就是MySQL的查詢過程,不少查詢優化工做實際上就是遵循一些原則,讓MySQL的優化器可以按照預想的合理方式運行而已。html

圖-MySQL查詢過程linux

1、優化的哲學

注:優化有風險,涉足需謹慎ios

一、優化可能帶來的問題?sql

   ·優化不老是對一個單純的環境進行,還極可能是一個複雜的已投產的系統;數據庫

   ·優化手段原本就有很大的風險,只不過你沒能力意識到和預見到;安全

   ·任何的技術能夠解決一個問題,但必然存在帶來一個問題的風險;服務器

   ·對於優化來講解決問題而帶來的問題,控制在可接受的範圍內纔是有成果;網絡

   ·保持現狀或出現更差的狀況都是失敗!架構

2.優化的需求?併發

   ·  穩定性和業務可持續性,一般比性能更重要;

   ·  優化不可避免涉及到變動,變動就有風險;

   ·  優化使性能變好,維持和變差是等機率事件;

   ·  切記優化,應該是各部門協同,共同參與的工做,任何單一部門都不能對數據庫進行優化!

   ·  因此優化工做,是由業務須要驅使的!

3.優化由誰參與?

在進行數據庫優化時,應由數據庫管理員、業務部門表明、應用程序架構師、應用程序設計人員、應用程序開發人員、硬件及系統管理員、存儲管理員等,業務相關人員共同參與。 

2、優化思路

1.優化什麼?

在數據庫優化上有兩個主要方面:即安全與性能。

   ·  安全->數據可持續性;

   ·  性能->數據的高性能訪問。

2.優化的範圍有哪些?

存儲、主機和操做系統方面:

   ·  主機架構穩定性;

   ·  I/O規劃及配置;

   ·  Swap交換分區;

   ·  OS內核參數和網絡問題。

應用程序方面:

   ·  應用程序穩定性;

   ·  SQL語句性能;

   ·  串行訪問資源;

   ·  性能欠佳會話管理;

   ·  這個應用適不適合用MySQL。

數據庫優化方面:

   ·  內存;

   ·  數據庫結構(物理&邏輯);

   ·  實例配置。

說明:不論是設計系統、定位問題仍是優化,均可以按照這個順序執行。

3優化維度?

數據庫優化維度有四個:

硬件、系統配置、數據庫表結構、SQL及索引。

優化選擇:

   ·  優化成本:硬件>系統配置>數據庫表結構>SQL及索引。

   ·  優化效果:硬件<系統配置<數據庫表結構<SQL及索引。

3、優化工具備啥?

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負載都很高:


4、基礎優化

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,仍是使用其餘種類的數據庫。用數據庫的最高境界就是不用數據庫。

5、數據庫優化

SQL優化方向:執行計劃、索引、SQL改寫。

架構優化方向:高可用架構、高性能架構、分庫分表。

1.數據庫參數優化?

調整

實例總體(高級優化,擴展):

 

鏈接層(基礎優化)

設置合理的鏈接客戶和鏈接方式:

SQL層(基礎優化)

2.存儲引擎層(innodb基礎優化參數)?

 

歡迎工做一到五年的Java工程師朋友們加入Java填坑之路:860113  481 羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用本身每一分每一秒的時間來學習提高本身,不要再用"沒有時間「來掩飾本身思想上的懶惰!趁年輕,使勁拼,給將來的本身一個交代!

相關文章
相關標籤/搜索