偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

在實際的業(yè)務(wù)系統(tǒng)開發(fā)中,雖然我們會嚴抓代碼質(zhì)量,但是慢 SQL 的檢測卻常常容易被忽視,今天我們就一起來總結(jié)一下關(guān)于慢 SQL 可能存在的系統(tǒng)運行風(fēng)險。

一、什么是慢 SQL

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

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

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

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

圖片

當然,這個值還可以重新設(shè)置,生產(chǎn)環(huán)境慢 SQL 一般會設(shè)置為0.1~0.2s?。當我們將其設(shè)置為0.2s?時,當前數(shù)據(jù)庫所有 SQL 的執(zhí)行時長超過0.2s的都會被視為慢 SQL。

可能有的同學(xué)會發(fā)出疑問,我們?yōu)槭裁匆粉櫬?SQL,有什么意義呢?

二、慢 SQL 危害

這里要從慢 SQL 的危害談起,以 MySQL 數(shù)據(jù)庫為例,總結(jié)起來有以下幾點:

  • 當出現(xiàn)慢查詢,DDL 操作都會被阻塞,也就是說創(chuàng)建表、修改表、刪除表、執(zhí)行數(shù)據(jù)備份等操作都需要等待,這對實時備份重要數(shù)據(jù)的系統(tǒng)來說是不可容忍的。
  • 慢查可能會占用 mysql 的大量內(nèi)存,嚴重的時候會導(dǎo)致服務(wù)器直接掛掉,整個系統(tǒng)直接癱瘓。
  • 慢 SQL 的執(zhí)行時間過長,可能會導(dǎo)致應(yīng)用的進程因超時被 kill,無法返回結(jié)果給到客戶端。
  • 造成數(shù)據(jù)庫幻讀、不可重復(fù)讀的概率更大,假設(shè)該慢 SQL 是一個更新操作但因執(zhí)行時間過長未提交,而另一條 SQL 也在更新數(shù)據(jù)并且已提交,用戶再次查詢的時候,看到的數(shù)據(jù)可能與實際結(jié)果不符。
  • 嚴重影響用戶體驗,SQL 的執(zhí)行時間越長,頁面加載數(shù)據(jù)耗時也就越長。

以千萬級的訂單表為例,未優(yōu)化的情況下,單表分頁查詢 10 條數(shù)據(jù),耗時:39s。

圖片

首先不說可能對數(shù)據(jù)庫服務(wù)器造成的潛在壓力,沒有任何一個用戶會在頁面查詢訂單查詢等待 39 秒!

三、如何定位慢 SQL

說了這么多,我們?nèi)绾稳ザㄎ宦?SQL 呢?

3.1開啟慢 SQL 監(jiān)控

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

show variables like 'slow_query_log%';

圖片

通過如下命令,開啟慢 SQL 監(jiān)控,執(zhí)行成功之后,客戶端需要重新連接才能生效。

-- 開啟慢 SQL 監(jiān)控
set global slow_query_log = 1;

圖片

如果想關(guān)閉慢 SQL 監(jiān)控,將其配置為0就可以了。

-- 關(guān)閉慢 SQL 監(jiān)控
set global slow_query_log = 0;

需要特別注意的是,當服務(wù)器重啟之后,當前配置會失效!

3.2配置慢 SQL 閥值

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

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

圖片

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

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

然后,退出客戶端,重新連接服務(wù)器,就生效了!

圖片

與之類似,當服務(wù)器重啟之后,當前配置會失效!

3.3永久開啟慢 SQL 監(jiān)控

以上的操作,當服務(wù)器不重啟會一直有效,但是當服務(wù)器一單重啟之后,配置就會失效,如果想永久生效,可以通過修改全局配置文件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 服務(wù)器

systemctl restart mysqld

3.4慢 SQL 監(jiān)控測試

初始化一張日志表,數(shù)據(jù)量在 10 萬左右就夠了,然后我們來執(zhí)行 SQL,看看是不是被正常抓取到。

圖片

圖片

很清晰的看到,慢 SQL 已經(jīng)被抓取記錄。

日志內(nèi)容詳解:

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

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

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

常見的用法如下:

查詢返回記錄集最多的10個 SQL;

mysqldumpslow -s r -t 10 /var/lib/mysql/ecs-203056-slow.log

查詢訪問次數(shù)最多的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 是怎么發(fā)生的

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

這得從 SQL 的執(zhí)行過程說起,我們先簡單的看看下面這個圖。

圖片

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

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

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

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

從I/O成本視角看:

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

從CPU成本視角看:

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

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

五、小結(jié)

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

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

六、參考

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

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

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

責任編輯:武曉燕 來源: Java極客技術(shù)
相關(guān)推薦

2018-04-13 15:32:40

SQL團隊開發(fā)

2014-01-10 10:53:29

移動廣告平臺進化分發(fā)

2011-07-28 09:09:23

Java

2020-05-08 09:37:32

網(wǎng)線網(wǎng)絡(luò)網(wǎng)速

2025-04-03 00:03:00

數(shù)據(jù)內(nèi)存網(wǎng)絡(luò)

2011-07-22 10:40:04

思科裁員

2015-03-23 11:56:58

2017-02-07 09:15:54

光纖傳輸介質(zhì)通信網(wǎng)絡(luò)

2009-03-12 10:03:00

雙絞線連接網(wǎng)絡(luò)

2016-12-01 09:30:03

運維網(wǎng)絡(luò)網(wǎng)線

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

二叉搜索樹數(shù)據(jù)結(jié)構(gòu)算法

2017-08-14 16:36:23

ASActivity內(nèi)存

2017-12-28 11:25:51

2019-09-02 10:38:30

網(wǎng)線攻擊MVP

2016-11-18 13:58:33

點贊
收藏

51CTO技術(shù)棧公眾號