MySQL進階篇(01):基於多個維度,分析伺服器性能

来源:https://www.cnblogs.com/cicada-smile/archive/2020/04/05/12637476.html
-Advertisement-
Play Games

本文源碼: "GitHub·點這裡" || "GitEE·點這裡" 一、伺服器性能簡介 1、性能定義 伺服器性能優化是一項非常艱巨的任務,當然也是很難處理的問題,在寫這篇文章的時候,特意請教下運維大佬,硬體工程師,資料庫管理,單從自己的實際開發經驗來看,看待這個問題的角度起碼是不全面的。 :在公司靠 ...


本文源碼:GitHub·點這裡 || GitEE·點這裡

一、伺服器性能簡介

1、性能定義

伺服器性能優化是一項非常艱巨的任務,當然也是很難處理的問題,在寫這篇文章的時候,特意請教下運維大佬,硬體工程師,資料庫管理,單從自己的實際開發經驗來看,看待這個問題的角度起碼是不全面的。

補刀一句:在公司靠譜少撕逼,工程師這個群體是很好交朋友的,互相學習一起進步,升職加薪他不好嗎?

服務性能定義:完成一個任務或者處理一次介面請求所需要的時間,這個時間是指響應完成時間,即請求發出,到頁面響應回顯結束,這是看待性能問題的基本邏輯。

2、分析性能

服務的基本過程一般如下圖,這是一張最簡單的前後端分離,加一臺資料庫存儲的流程,但是想要說明一個複雜的邏輯。

從頁面請求,到獲取完整的響應結果,這個過程每個環節都可能導致性能問題,拋開網路,硬體,伺服器,MySQL存儲這些核心客觀因素,單是下麵這行代碼就可以秒掉很多人的努力。

Thread.sleep(10000); // 仿佛整個世界都安靜了。

影響性能的因素很多,一般說性能優化會從下麵幾個方面考慮:

  • 網路傳輸,比如私有雲和公有雲的交互,介面傳輸內容過大;
  • 應用服務,介面設計是否最簡,沒有邏輯問題,架構設計是否合理;
  • 存儲服務,MySQL的查詢寫入,表設計是否合理,連接池配置是否合理;
  • 硬體設施,CPU和記憶體的利用是否在合理區間,緩存是否合理;

這些問題每個處理起來都是非常耗費時間,且對人員的要求相對較高,不說一定要到達專家水平,起碼性能問題出現時候,基本的意識要有。

二、MySQL執行機制

基於上述流程圖,MySQL性能分析主要從下麵幾個方面切入,基本方向就不會偏。

1、連接池配置

查看預設最大連接數配置:

SHOW VARIABLES LIKE 'max_connections';

最小連接數是連接池一直保持的會話連接,這個值相對好處理許多,評估服務在正常狀態下需要多少會話連接。

最大連接數伺服器允許的最大連接數值,這個參數的設計就比較飄逸,需要對高併發業務有把控,且要分析SQL性能,和CPU利用率(基本上是70%-85%),想獲得這一組參數,可是相當不容易,需要測試精細,配合運維進行服務監控記錄,開發不斷優化,可能要分庫分表,或者集群,拆服務分散式化等一系列操作,最終才能得到合理處理邏輯,當然這樣費心對待的都是核心業務,一般的業務也就是經驗上把控。

2、SQL執行過程

MySQL解析器識別SQL的基本語法,生成語法樹,然後優化器輸出SQL可執行計劃,非常複雜的流程。

  • 客戶端發送請求到MySQL伺服器;
  • 如果執行查詢,會檢查緩存是否命中;
  • 服務端進行SQL解析,預處理,最後優化器生成執行計劃;
  • 根據執行計劃調用存儲引擎API執行;
  • 返回客戶端處理結果;

補刀一句:這也就是為什麼現在介面提倡最簡化設計,或者介面拆分,分步執行,不要問這樣會不會多次請求,給網路造成壓力,這都5G時代了。

3、邏輯總結

總結一句話:分析是否存在MySQL服務的性能問題,需要考量是不是服務配置問題,或者SQL編譯過程問題,導致大量等待時間,還是SQL執行有問題,或者查詢數據量過大導致執行過程漫長。

補刀一句:MySQL性能問題的基本原因很簡單,數據量不斷變大,伺服器承載不住。作為開發,這是面對資料庫優化的根本原因。

三、執行語句分析

1、基本描述

上面幾個方面都是在說明面對服務性能問題時,意識上要清楚的邊界,作為開發實際上要面對兩個直接問題:表設計,SQL語句編寫,大部分的開發都被這兩個問題毒打過。

2、表結構設計

表設計:表設計關係到資料庫的各個方面知識:數據類型選擇,索引結構,編碼,存儲引擎等。是一個很大的命題,不過也遵循一個基本規範:三範式。

規範的表結構,合適的數據類型可以降低資源的占用,索引可以提高查詢效率,存儲引擎更是關係到事務方面的問題。

表的結構的邏輯清晰,是後續查詢和寫入的基本條件,結構過大,會出現很多索引,分表結構多,帶來很多連接查詢,同樣會把開發感覺按在地上。這就涉及到一個玄學:開發要根據經驗和因素,權衡表結構設計。

補刀一句:如果你去問3.5年的開發,最想寫什麼業務,他肯定會說單表的增刪改查,為什麼?因為這類任務是不會排期給他的。

3、數據更新

假設在表結構符合邏輯的情況下,數據更新(增刪改)操作一般情況下不會出現較大問題,遵循幾個基本原則。

  • 數據量大的寫入,執行批量操作,占用連接少;
  • 刪除和更新要考慮鎖定的粒度,不要導致大範圍鎖定;
  • 經常執行刪除操作,要考慮記憶體碎片問題;
  • 批量操作可以基於應用層面使用多線程處理;

4、數據查詢

查詢是開發中最常面對的問題,針對查詢的規範也是特別多,確實查詢也是最容易出錯的環節。但是影響查詢的因素很多,可能很多情況下查詢只是背黑鍋:

  • 表設計規範,減少各種關聯,子查詢;
  • 列類型規範,數據值規範,Null和空處理;
  • 索引結構和使用規範,對查詢性能影響最大;
  • 存儲引擎選擇合適,直接影響鎖定粒度大小;
  • 外鍵關聯導致表強行耦合,最討厭的一個功能;

SQL在執行的時候,如果性能很差,還需要基於MySQL慢查詢機制進行分析,查看是否出現磁碟IO,臨時表,索引失效等各種問題。

四、模塊總結

上述的描述可能感覺有點亂,但是整體上看,就分為下麵三個模塊:

  • 應用服務流程化分析,判斷瓶頸出現環節;
  • 熟悉MySQL基本機制,分析等待和執行時間;
  • MySQL的表結構設計和SQL執行優化;

這篇文章只是籠統描述一下服務性能的問題,重點還是想陳述一個基本邏輯:具備服務性能問題分析的意識,且意識的邊界相對全面,不要只盯著某個方面思考。

補刀一句:因為文章的分類是MySQL模塊,所以重點的描述也在MySQL層面。實際情況中,任何層面都可能導致性能問題。

五、源代碼地址

GitHub·地址
https://github.com/cicadasmile/mysql-data-base
GitEE·地址
https://gitee.com/cicadasmile/mysql-data-base

推薦閱讀:

MySQL資料庫基礎

序號 文章標題
01 MySQL基礎:經典實用查詢案例,總結整理
02 MySQL基礎:從五個維度出發,審視表結構設計
03 MySQL基礎:系統和自定義函數總結,觸發器使用詳解
04 MySQL基礎:存儲過程和視圖,用法和特性詳解
05 MySQL基礎:邏輯架構圖解和InnoDB存儲引擎詳解
06 MySQL基礎:事務管理,鎖機制案例詳解
07 MySQL基礎:用戶和許可權管理,日誌體系簡介

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 良許在工作中,寫過一個 Shell 腳本,這個腳本可以從 4 個 NTP 伺服器輪流獲取時間,然後將最可靠的時間設置為系統時間。 因為我們對於時間的要求比較高,需要在短時間內就獲取到正確的時間。所以我們就需要對這個腳本運行時間進行測試,看看從開始運行到正確設置時間需要花費多少時間。 其實在工作中,還 ...
  • 1、命令基礎 1.1、命令操作語法 命令 [參數] [文件] 參數,可有可無 文件,可有可無 2、基礎命令 2.1、查看當前工作目錄 pwd print name of current/workin directory 列印 名字 或 工作 目錄 2.2、切換目錄 cd cd 目錄 相對路徑與絕對路 ...
  • [TOC] 1.集群架構 | 主機名 | 角色 | IP地址 | | : : | : : | : : | | hdss7 21.host.com | flannel | 10.4.7.21 | | hdss7 22.host.com | flannel | 10.4.7.22 | 部署方法以hdss ...
  • redis 實戰-redis 事務 1.描述 redis 事務單獨的隔離操作:事務中的所有命令都會序列化、按順序執行。事務在執行過程中,不會被其他客戶端發送過來的命令請求所打斷。 redis 事務沒有隔離級別的概念:隊列中的命令沒有提交之前都不會實際的被執行,因為事務提交前任何指令都不會被實際執行, ...
  • 資料庫隔離級別 如果沒有隔離級別會出現的問題 臟讀 意思是讀取到了事務正在修改的數據,如果事務回滾,那麼拿到的數據就是錯誤的 | 時間 | 事務A | 事務B | | | | | | 1 | 開始事務 | | | 2 | 讀取quantity為5 | | | 3 | 修改quantity為4 | | ...
  • 操作系統配優化 執行計劃與鎖表查看 --查看連接信息以及連接執行的命令 SHOW PROCESSLIST --查看當前被鎖住的表 show OPEN TABLES where In_use > 0; --開啟會話級別的profile SET profiling=1 --查看所有的資料庫操作執行過程 ...
  • 在SQL Server 2012版本中,當重新啟動SQL Server實例時,表的身份值將被跳轉,而實際跳轉的值取決於身份列數據類型。 如果是整數(int)數據類型,則跳轉值為1000;如果為大整數(bigint),則跳轉值為10000。從我們的應用程式角度來看,此增量不適用於所有業務案例,尤其是當... ...
  • 為了研究一下sql自動化檢查和分析工具,是否有網上介紹的好用,我在本地進行soar 和 soar-web的安裝和使用。 初步的實驗結果,總結如下: 1. 安裝相對來說較為麻煩,特別是soar-web的依賴包安裝,涉及到python pip相關組件的下載安裝。 2. 啟動soar-web會遇到一些奇怪 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...