慢SQL,壓垮團隊的最後一根稻草!

来源:https://www.cnblogs.com/dxflqm/archive/2022/08/16/16590573.html
-Advertisement-
Play Games

一、什麼是慢 SQL 什麼是慢SQL?顧名思義,運行時間較長的 SQL 語句即為慢 SQL! 那問題來了,多久才算慢呢? 這個慢其實是一個相對值,不同的業務場景下,標準要求是不一樣的。 我們都知道,我們每執行一次 SQL,資料庫除了會返回執行結果以外,還會返回 SQL 執行耗時,以 MySQL 數據 ...


一、什麼是慢 SQL

什麼是慢SQL?顧名思義,運行時間較長的 SQL 語句即為慢 SQL

那問題來了,多久才算慢呢?

這個慢其實是一個相對值,不同的業務場景下,標準要求是不一樣的。

我們都知道,我們每執行一次 SQL,資料庫除了會返回執行結果以外,還會返回 SQL 執行耗時,以 MySQL 資料庫為例,當我們開啟了慢 SQL 監控開關後,預設配置下,當 SQL 的執行時長大於 10 秒,會被記錄到慢 SQL 的日誌文件中。

當然,這個值還可以重新設置,生產環境慢 SQL 一般會設置為0.1~0.2s。當我們將其設置為0.2s時,當前資料庫所有 SQL 的執行時長超過0.2s的都會被視為慢 SQL。

可能有的同學會發出疑問,我們為什麼要追蹤慢 SQL,有什麼意義呢?

二、慢 SQL 危害

這裡要從慢 SQL 的危害談起,以 MySQL 資料庫為例,總結起來有以下幾點:

  • 當出現慢查詢,DDL 操作都會被阻塞,也就是說創建表、修改表、刪除表、執行數據備份等操作都需要等待,這對實時備份重要數據的系統來說是不可容忍的
  • 慢查可能會占用 mysql 的大量記憶體,嚴重的時候會導致伺服器直接掛掉,整個系統直接癱瘓
  • 慢 SQL 的執行時間過長,可能會導致應用的進程因超時被 kill,無法返回結果給到客戶端
  • 造成資料庫幻讀、不可重覆讀的概率更大,假設該慢 SQL 是一個更新操作但因執行時間過長未提交,而另一條 SQL 也在更新數據並且已提交,用戶再次查詢的時候,看到的數據可能與實際結果不符
  • 嚴重影響用戶體驗,SQL 的執行時間越長,頁面載入數據耗時也就越長

以千萬級的訂單表為例,未優化的情況下,單表分頁查詢 10 條數據,耗時:39s

首先不說可能對資料庫伺服器造成的潛在壓力,沒有任何一個用戶會在頁面查詢訂單查詢等待 39 秒

三、如何定位慢 SQL

說了這麼多,我們如何去定位慢 SQL 呢?

3.1、開啟慢 SQL 監控

以 MySQL 為例,我們可以通過如下方式,查詢是否開啟慢 SQL 的監控。

show variables like 'slow_query_log%';

通過如下命令,開啟慢 SQL 監控,執行成功之後,客戶端需要重新連接才能生效。

-- 開啟慢 SQL 監控
set global slow_query_log = 1;

如果想關閉慢 SQL 監控,將其配置為0就可以了。

-- 關閉慢 SQL 監控
set global slow_query_log = 0;

需要特別註意的是,當伺服器重啟之後,當前配置會失效

3.2、配置慢 SQL 閥值

預設的慢 SQL 閥值是10秒,可以通過如下語句查詢慢 SQL 的閥值。

-- 查詢慢 SQL 的閥值
show variables like "long_query_time";

我們可以通過如下方式,將慢 SQL 閥值配置成0.2秒。

-- 修改慢 SQL 的閥值
set global long_query_time = 0.2;

然後,退出客戶端,重新連接伺服器,就生效了!

與之類似,當伺服器重啟之後,當前配置會失效

3.3、永久開啟慢 SQL 監控

以上的操作,當伺服器不重啟會一直有效,但是當伺服器一單重啟之後,配置就會失效,如果想永久生效,可以通過修改全局配置文件my.cnf使之永久生效。

以 CentOS 為例,打開my.cnf配置文件,添加如下配置變數。

[mysqld]
slow_query_log = ON
slow_query_log_file = /var/lib/mysql/ecs-203056-slow.log
long_query_time = 1

重啟 mysql 伺服器

systemctl restart mysqld

3.4、慢 SQL 監控測試

初始化一張日誌表,數據量在 10 萬左右就夠了,然後我們來執行 SQL,看看是不是被正常抓取到。

很清晰的看到,慢 SQL 已經被抓取記錄。

日誌內容詳解:

  • Time:表示客戶端查詢時間
  • root[root]:表示客戶端查詢用戶和IP
  • Query_time:表示查詢耗時
  • Lock_time:表示等待 table lock 的時間,註意InnoDB的行鎖等待是不會反應在這裡的
  • Rows_sent:表示返回了多少行記錄(結果集)。
  • Rows_examined:表示檢查了多少條記錄。

除此之外,我們還可以藉助mysqldumpslow命令工具,分析慢 SQL 的數據情況,可以通過如下參數進行組合分析

-s         表示按何種方式排序,支持的參數如下
            al: 平均鎖定時間
            ar: 平均返回記錄數
            at: 平均查詢時間
            c: 訪問次數
            l: 鎖定時間
            r: 返回記錄
            t: 查詢時間
-t NUM       返回前面多少條的數據
-g PATTERN   後邊搭配一個正則匹配模式,大小寫不敏感

常見的用法如下:

  • 查詢返回記錄集最多的10個 SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/ecs-203056-slow.log
  • 查詢訪問次數最多的10個SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/ecs-203056-slow.log
  • 查詢按照時間排序的前10條裡面含有左連接的查詢語句
mysqldumpslow -s t -t 10 -g "LEFT JOIN" /var/lib/mysql/ecs-203056-slow.log

四、慢 SQL 是怎麼發生的

面對這種耗時巨長的 SQL,我們不禁會發出一個疑問,它是怎麼發生的呢?

這得從 SQL 的執行過程說起,我們先簡單的看看下麵這個圖。

一條 SQL 語句執行時,總結起來大概分為以下幾個步驟:

  • 1.若查詢緩存打開則會優先查詢緩存,若命中則直接返回結果給客戶端。
  • 2.若緩存未命中,此時 MySQL 需要搞清楚這條語句需要做什麼,則通過分析器進行詞法分析、語法分析。
  • 3.搞清楚要做什麼之後,MySQL 會通過優化器對 SQL 進行優化,生成一個最優的執行計劃
  • 4.最後通過執行器與存儲引擎提供的介面進行交互,將結果返回給客戶端

在 MySQL 執行過程中,優化器可能會對我們即將要執行的 SQL 進行改造,改造思路如下:

  • 1.根據搜索條件,找出 SQL 中所有可能使用的索引
  • 2.然後計算全表掃描的成本開銷
  • 3.接著計算使用不同索引執行查詢的成本開銷
  • 4.最後會對比各種執行方案的成本開銷,找出開銷值最小的那一個

其中影響成本開銷值的計算,主要是I/O成本CPU成本這兩個指標。

I/O成本視角看:

  • 當表的數據量越大,需要的 I/O 次數也就越多
  • 從磁碟讀取數據比從緩存讀取數據,I/O 消耗的時間更多
  • 全表掃描比通過索引快速查找,I/O 消耗的時間和次數更多

CPU成本視角看:

  • 當 SQL 中有排序、子查詢等複雜的操作時,CPU 需要先把數據存到臨時表中,再對數據進行加工,需要的 CPU 資源更多
  • 全表掃描相比於通過索引快速查找,需要的 CPU 資源也更多

因此我們不難發現,在沒有開啟緩存的情況下,當表的數據量越大,如果 SQL 又沒有走索引,很容易發生查詢慢的問題。

五、小結

本文主要圍繞慢 SQL 的定位和可能存在的風險進行了簡單的介紹,整篇介紹的算是一個入門級的知識,文章內容難免有些理解不到位的地方,歡迎網友留言指出!

由於篇幅的原因,我們會在下篇文章中介紹慢 SQL 的優化思路。

六、參考

1、稀土掘金 - 三個豬皮匠 - 慢SQL優化一點小思路

2、博客園 - 雪山上的蒲公英 - 慢 SQL 分析

3、博客園 - 慢查詢的危害


作者:程式員志哥
出處:www.pzblog.cn
資源:微信搜【Java極客技術】關註我,回覆 【cccc】有我準備的一線程式必備電腦書籍、大廠面試資料和免費電子書。 希望可以幫助大家提升技術和能力。


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

-Advertisement-
Play Games
更多相關文章
  • MySQL刪除數據的方式 以MySQL 5.7為例,資料庫刪除數據的方式一共有以下三種: delete truncate drop 以上三種方式都可以刪除數據,但是使用場景是不同的。 對於整個表進行刪除的執行速度來說: drop > truncate >> delete MySQL刪除數據的方式-d ...
  • FileMaker Pro19 Advanced 是一款功能強大、易於使用的資料庫軟體。它能幫助你和你的團隊更快地完成各種類型的工作。在商業、政府和教育領域,有數百萬的用戶使用 FileMaker Pro 輕鬆地管理 iPad、iPhone、Windows、Mac 和 Web 上的全部信息。 Mac ...
  • 數據可視化工具數不勝數,只看顏值的話,這4款才是我的心頭好: 1. 山海鯨可視化 官網:https://www.shanhaibi.com/ 山海鯨可視化是一款國產自研的數據可視化大屏編輯軟體,零基礎也能快速上手。幫助大家越過了數字孿生系統開發的高技術門檻,讓沒有技術基礎的用戶只需通過簡單的點擊拖拽 ...
  • (以下情況僅針對StoneDB 1.0版本不支持的部分DML和DDL操作,StoneDB 2.0及以上版本將無需此類操作) 主從複製中,主庫的任何更新都會同步到從庫,如果從庫不想重做主庫的某個更新動作,可以使用以下兩種方法進行規避。當然,最終帶來的影響是主從環境數據不一致的問題。 以下的測試環境中, ...
  • Redis之五大類型常用指令 redis的一些小知識 redis伺服器埠預設是6379 在編譯完成後的bin目錄下啟動服務端:redis-server 客戶端連接操作:redis-cli -h localhost -p 6379,如果是一臺機器可以省略後面的:redis-cli (備註:可以複製r ...
  • 1、問題現象 create database syw_mtr; use syw_mtr; CREATE TABLE t1 (f1 VARCHAR(255) CHARACTER SET utf8)engine=tianmu; CREATE TABLE t2 AS SELECT LEFT(f1,171) ...
  • 在StoneDB中,數據包分為以下幾類: 不相關的數據包:不滿足查詢條件的數據包。 相關的數據包:滿足查詢條件的數據包。 可疑的數據包:數據包中的數據部分滿足查詢條件,需要進一步解壓縮數據包才能得到滿足條件的數據行。 通過對數據包的劃分,知識網格技術過濾掉不相關的數據包,讀取相關的數據包和可疑的數據 ...
  • 背景 客戶凌晨把HIS資料庫遷移到配置更高的新伺服器,上午業務高峰時應用非常緩慢,嚴重影響到業務運行。 1.現象 通過SQL專家雲實時可視化界面看到大量的綠點,綠點表示會話在等待某項資源,綠點越大說明等待的會話數越多。 進入活動會話列表,發現大量會話的狀態為runnable,runnable代表這個 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...