成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

數據庫 MySQL
我們都知道,我們每執行一次 SQL,數據庫除了會返回執行結果以外,還會返回 SQL 執行耗時,以 MySQL 數據庫為例,當我們開啟了慢 SQL 監控開關后,默認配置下,當 SQL 的執行時長大于 10 秒,會被記錄到慢 SQL 的日志文件中。

在實際的業務系統開發中,雖然我們會嚴抓代碼質量,但是慢 SQL 的檢測卻常常容易被忽視,今天我們就一起來總結一下關于慢 SQL 可能存在的系統運行風險。

一、什么是慢 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 語句執行時,總結起來大概分為以下幾個步驟:

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

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

  • 根據搜索條件,找出 SQL 中所有可能使用的索引。
  • 然后計算全表掃描的成本開銷。
  • 接著計算使用不同索引執行查詢的成本開銷。
  • 最后會對比各種執行方案的成本開銷,找出開銷值最小的那一個。
  • 其中影響成本開銷值的計算,主要是I/O成本和CPU成本這兩個指標。

從I/O成本視角看:

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

從CPU成本視角看:

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

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

五、小結

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

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

六、參考

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

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

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

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2018-04-13 15:32:40

SQL團隊開發

2014-01-10 10:53:29

移動廣告平臺進化分發

2011-07-28 09:09:23

Java

2020-05-08 09:37:32

網線網絡網速

2025-04-03 00:03:00

數據內存網絡

2011-07-22 10:40:04

思科裁員

2015-03-23 11:56:58

2017-02-07 09:15:54

光纖傳輸介質通信網絡

2009-03-12 10:03:00

雙絞線連接網絡

2016-12-01 09:30:03

運維網絡網線

2021-03-23 08:21:06

GolangPython字符

2020-07-16 11:16:57

云計算SD-WAN運營

2010-09-10 16:17:27

2016-05-18 14:50:57

運維PortfastAPI

2022-12-13 10:28:53

2021-04-06 08:20:24

二叉搜索樹數據結構算法

2017-08-14 16:36:23

ASActivity內存

2017-12-28 11:25:51

2019-09-02 10:38:30

網線攻擊MVP

2016-11-18 13:58:33

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色狠狠桃花综合 | 国产乱人伦 | 国产精品美女一区二区三区 | 午夜激情视频 | 久久久毛片 | 色综合久久88色综合天天 | 人人看人人搞 | 欧美成人不卡 | 久久久精彩视频 | 欧美精品欧美精品系列 | 狠狠操电影 | av网站在线看 | 国产成人福利视频 | 爱爱视频日本 | 97人人澡人人爽91综合色 | 日韩精品一区二区三区老鸭窝 | 国产精品一区二区三区久久久 | 精品国产一级片 | 亚洲精品视频在线观看视频 | 亚洲国产欧美在线 | 免费国产一区二区 | 久久精品日产第一区二区三区 | 亚洲一区二区三区四区av | 99久久婷婷国产综合精品 | 亚洲成人精品 | 亚洲精品久久久一区二区三区 | 久久久久久国产精品免费免费 | 91精品国产高清久久久久久久久 | 欧美一区二区三区在线观看视频 | 国产精品久久 | 免费视频一区二区三区在线观看 | 日韩成人在线免费视频 | 精品在线一区二区 | 亚洲精品粉嫩美女一区 | 麻豆视频在线看 | aaaaaa大片免费看最大的 | 99久久久久国产精品免费 | 日本大香伊一区二区三区 | 国产欧美在线 | 99视频在线| 亚洲精品久久久9婷婷中文字幕 |