(一) 在說數據庫優化時,我們應該做些什麼?

00 優化之前我們應該做什麼?

在說給數據庫做性能優化時,我們應該做些什麼呢?

我們在優化之前一定要了解數據庫內部原理嗎?

要去不斷調整數據庫、操作系統的參數呢?

數據庫的性能就只是數據庫的架構決定的,跟應用、開發關係不大嗎?

我們是不是必須遇到了瓶頸要做讀寫分離、分庫分表呢?

NO!

其實,它們可能都是數據庫優化的一部分,但既不是開始,也不是目的,更不是全部。

我們首先要搞懂,爲什麼要做數據庫的優化?

從業務角度出發,是爲了減少用戶響應時間。

從數據庫角度看,是爲了減少數據庫SQL響應時間。

從數據庫的服務器角度來說,是爲了充分使用數據庫服務器物理資源,減少CPU、IO、內存的使用率。

我們在優化之前,一定要給出一個目標。

響應時間變短,優化前數據庫的平均響應時間是500ms,指定優化目標縮減到200ms。CPU佔用率變少,優化前高峯期使用率70%,優化後變成50%。IO使用率變低,優化前IO WAIT 30%,優化後10%。SQL執行時間變短,優化前1000條SQL執行爲3600s,優化後降到200s。

還有其他諸如硬解析率、軟解析率、TPS壓測值,也都可以作爲一個指標。

至於指標到底怎麼定?我們接下來繼續說。

01 做數據庫優化有流程嗎?

我們應該制定一個什麼樣的流程,來做數據庫優化?

或者說,我們做數據庫優化時,應該要經過一個什麼流程呢?

如圖:


優化流程


1、我們首先應該瞭解待優化的問題;【到底出了什麼問題?】

2、收集系統信息;【哪裏出了問題?】

3、制定優化目標;【得到客戶認可,解決什麼問題?】

4、分析性能問題;【具體的問題在哪裏?什麼原因引起的問題?】

5、制定優化方案;【針對分析出的問題怎麼去解決?】

6、實施優化方案;【誰來實施?怎麼實施?有沒有風險?】

7、判斷是否達到優化目標;【效果怎麼樣?如果不行還需要重新分析問題。】

8、編寫優化報告。【目標達到,我們要編寫優化報告,告訴客戶解決了什麼問題。】

以上,便是我們數據庫優化的一個大體流程。

接下來具體說說怎麼做。

02 信息收集與目標制定

首先,我們要了解待優化的問題。

從哪裏瞭解?用戶、運維、開發人員等等。

我們一般能瞭解到什麼信息?

用戶一般會說應用訪問慢、系統卡、打不開等等。

運維人員會說服務器的硬件資源佔用率高,如CPU很高、內存不夠了等等

開發人員會說接口總是報錯,數據庫響應時間變得很長,TPS、QPS壓不上去。

那麼,這些信息都是真實有效的嗎?

我們在這裏謹記一個守則:凡是“判斷”、“分析”類的信息統統屏蔽,凡是“症狀”、“表現”類的信息細細保留。

why?

因爲別人的“判斷”,特別是來自以上三類人羣的“判斷”,大部分是片面的,很可能會干擾你的思路,甚至會把你帶到溝裏去,讓你對某些問題視而不見,導致做了大半天的無用功。

我們要有一套自己的優化思路。

在瞭解到當前待優化的問題後,我們緊跟着要幹什麼?開始優化嗎?

當然不是。

而是最基本的,來到第二步,收集系統信息。並且儘可能全面地收集系統信息。

我們可以從業務、數據庫、服務器等角度收集系統信息。分類保存,以便後期優化時使用。

然後纔是我們前面章節所說的,制定優化目標。

怎麼制定優化目標?

首先是分析數據庫大概存在的瓶頸,然後是制定明確的優化目標(如業務、數據庫、服務器等多種角度)。

最重要的是,優化前一定要跟客戶溝通好,讓客戶確認本次優化的目標,得到認可。

再接着,就是具體地分析性能問題了。

03 問題分析

問題分析這一塊可以說的內容太多了,所以單獨放了一小節。

首先,我們可以採用自上而下的順序進行分析。

操作系統(CPUIONETWORK -> 數據庫實例  -> 數據庫對象   -> SQL

對操作系統我們採用什麼工具呢?我們現在的服務一般都是部署在Linux上的,所以我們一般使用以下這些工具進行檢測。

SARHTOPNMONTOPETHTOOL……

那對於數據庫,我們有什麼工具來分析數據庫的等待時間瓶頸呢?

ORACLE:AWR、STATSPACK、內部視圖、GRID CONTROL、STA、SAA、ADDMMYSQL:慢日誌、PERCONA TOOLKIT、MEM、內部視圖……SQLSERVER:SQL PROFILE、內部視圖……POSTGERS:pg_stat_statements、SQL trace……達夢:AWR、內部視圖、監控工具、SQL trace……

在使用上面的工具對操作系統、數據庫進行信息收集、初步分析後,我們緊接着就要根據找到的瓶頸進行深入分析。

從哪些方面分析?

操作系統參數是否配置合理?數據庫參數是否合理?索引設計合理嗎?數據庫有沒有bug?排除下捕獲主要的問題SQL,對其進行深入分析硬件資源是不是不足了?數據庫的選型是否恰當?數據庫表設計是不是合理?是不是業務流程的設計存在問題導致的數據庫性能問題?

從實際的優化經驗來說,大部分的數據庫性能問題都是由問題SQL導致的。而問題SQL的大部分起因都是索引設計不合理,甚至沒有索引。

04 制定及實施優化方案

在找到問題原因後,我們怎麼去制定並實施優化方案呢?

數據庫架構調優數據庫表結構優化設計操作系統內核參數優化數據庫參數優化添加或刪除索引改寫SQL語句調整應用流程採用數據庫高級特性升級硬件……

這些都是優化的方案,那我們怎麼選擇呢?

歸根到底,還是要根據我們問題分析的結果去制定。一個完整的優化方案應該包含如下內容:

1、背景;2、問題現象;3、分析過程及結論;4、優化建議;5、實施計劃及風險。

我們例舉一個案例,這個案例是oracle的。

1、背景

運維人員反應系統報表出不出來。

2、問題現象

XX系統經常夜裏12點就刷不出來了,要等很長時間。

3、分析過程及結論

從整體ASH報告分析,數據庫性能壓力一般,但是特定時間的數據庫問題比較明顯,一般集中在晚上20:00-凌晨1:00左右。

某些SQL執行時間到達1000s以上。這類SQL必須優化。

4、優化建議

1)從AWR報告抓取問題SQL,提交開發修改。2)對log_XXX_detail等類似大表進行修改,調整字段類型,並對錶進行分析。

5、實施計劃及風險

基本無風險;但需應用配合,無需重啓數據庫。

在實施方案的時候,我們需要注意什麼?

1、數據庫實例優化方案應由運維人員及DBA實施;

2、SQL優化方案由開發人員修改應用措施;

3、任何類型的實施在操作前都需要做好計劃及回滾方案。

05 編寫優化報告

我們在優化完畢了,這個事情就結束了嗎?

不!

我們還要對整體優化做出總結。

why?

因爲我們要體現出優化的價值,並且爲下次優化打好基礎。

我們的報告要能明確體現出優化的效果。

優化報告怎麼寫?一般注意以下幾個要素:

1、數據庫優化背景;2、索引重建優化前後對比;3、CPU使用率;4、磁盤基線;5、鎖使用情況;6、其他未盡之說明。

爲什麼要寫優化報告?

一言以蔽之,這就是你工作中的業績報告。如果幹了活不被人知,不爲人曉,那就是個傻把式。

升職加薪跟你有什麼關係呢?

接下來舉幾個簡單的優化報告的案例。

實例1:Oracle

某項目因IO資源不足導致數據庫性能低下

數據庫現象:CPU大量消耗

應用系統現象:大量IO等待、陣列IO不足

操作:購買新陣列、遷移數據庫

效果:問題基本緩解

實例2:SQLSERVER

某項目數據庫計算時間超過10小時

數據庫現象:CPU和IO佔用率較低

應用現象:系統基本空閒

操作:重新改寫計算邏輯

效果:效率提升10倍以上

實例3:MYSQL

某項目數據庫經常中斷

數據庫現象:主主模式經常出現數據不一致

應用系統現象:無明顯特徵

操作:調整架構爲MHA模式

效果:數據庫故障現象充分緩解

06 總結

梳理下本章我們學習的內容:

1、瞭解優化流程,收集問題信息。

2、優化流程的重點是問題分析這一步,要能通過科學的方法、便捷的工具,敏銳地發現系統瓶頸或者故障點;

3、優化可以從多個角度考慮,思路要開闊;

4、優化有大致的流程,但,是沒有固定方法的。

07 後記

以上這一篇內容是數據庫優化系列文章一篇,內容基本上是我在前公司的《數據庫訓練營》學習到的內容。

我覺得我遇到的這位老師說的很有道理。

其實問題並不可怕,怕的是不知道問題在哪?

問題也不難解決,難的是知道解決問題的方向。

僅以此希望跟大家分享。

後續的文章也會以oracle、mysql爲主,從理論到實踐,從方法到實戰,來繼續我們的數據庫優化之路。

我的小專欄:https://xiaozhuanlan.com/topic/1273960485

本文分享自微信公衆號 - 架構師之殤(ysistrue)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章