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

Mysql如何定位慢查詢,以及SQL語句執行很慢, 如何分析呢?

數據庫 MySQL
慢查詢日志記錄了所有執行時間超過指定參數(long_query_time,單位:秒,默認10秒)的所有SQL語句的日志。

思考:在MySQL中,如何定位慢查詢??

慢查詢表象:頁面加載過慢、接口壓測響應時間過長(超過1s)

1. 方案一:開源工具

調試工具:Arthas 運維工具:Prometheus 、Skywalking

圖片

2.方案二:MySQL自帶慢日志(重點)

慢查詢日志記錄了所有執行時間超過指定參數(long_query_time,單位:秒,默認10秒)的所有SQL語句的日志。

MySQL的慢查詢日志默認沒有開啟,可以通過查看系統變量 slow_query_log。

show variables like '%slow_query_log%'

如果要開啟慢查詢日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息

2.1. 開啟SQL慢查詢日志

開啟SQL慢查詢日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

# 開啟MySQL慢日志查詢開關
slow_query_log=1
# 設置慢日志的時間為2秒,SQL語句執行時間超過2秒,就會視為慢查詢,記錄慢查詢日志
long_query_time=2

配置完畢之后,通過一下命令查看,日志文件地址

show variables like '%slow_query_log%';

配置完畢之后,通過以下指令重新啟動MySQL服務器進行測試,查看慢日志文件中記錄的信息

2.2. 慢查詢如何定位總結

  1. 介紹一下當時產生問題的場景(我們當時的一個接口測試的時候非常的慢,壓測的結果大概5秒鐘)
  2. 我們系統中當時采用了運維工具( Skywalking ),可以監測出哪個接口,最終因為是sql的問題
  3. 在mysql中開啟了慢日志查詢,我們設置的值就是2秒,一旦sql執行超過2秒就會記錄到日志中(調試階段)

3. explain執行計劃

思考:那這個SQL語句執行很慢, 如何分析呢?

可以采用EXPLAIN 或者 DESC命令獲取 MySQL 如何執行 SELECT 語句的信息

語法:

-- 直接在select語句之前加上關鍵字 explain / desc
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 條件 ;

Explain 執行計劃中各個字段的含義:

字段

含義

id

表示執行順序,id相同從上到下執行,不同值越大越先執行

select_type

示 SELECT 的類型,常見的取值有 SIMPLE(簡單表,即不使用表連接或者子查詢)、PRIMARY(主查詢,即外層的查詢)、UNION(UNION 中的第二個或者后面的查詢語句)、SUBQUERY(SELECT/WHERE之后包含了子查詢)等

type

表示連接類型,性能由好到差的連接類型為NULL、system、const、eq_ref、ref、range、 index、all

possible_key

顯示可能應用在這張表上的索引,一個或多個。

key

實際使用的索引,如果為NULL,則沒有使用索引。

key_len

索引占用的大小

Extra

額外的優化建議

通過它們keykey_len 和查看是否可能會命中索引

Extra

含義

Using where; Using Index

查找使用了索引,需要的數據都在索引列中能找到,不需要回表查詢數據

Using index condition

查找使用了索引,但是需要回表查詢數據

3.1 type連接類型說明

  • system:一般查詢系統中的表才會出現
  • const:根據主鍵查詢
-- 語句中id表示的是主鍵
explain select * from   tb_user where id=1;
  • eq_ref:表示使用唯一索引或主鍵進行等值連接檢索。通常出現在具有關聯表的等值連接查詢,其中連接條件使用了唯一索引或主鍵。例如,通過外鍵連接兩個表,或者使用JOIN語句時,連接條件涉及到唯一索引或主鍵。
  • ref:表示使用非唯一索引進行等值連接檢索。通常出現在使用非唯一索引進行查詢的情況,其中每個索引鍵值可能匹配多行記錄。
-- name 是索引
 explain SELECT * FROM tb_user WHERE name= '李四';
  • range::表示使用索引進行范圍查詢。通常出現在使用范圍操作符(如BETWEEN、>、<)進行查詢時
explain SELECT * FROM tb_user WHERE id BETWEEN 1 AND 10;
  • index:示全索引掃描,即遍歷整個索引來定位記錄,而不是根據索引中的具體值進行查找。通常出現在沒有合適的索引可用,或者查詢需要遍歷大部分或全部索引的情況。
  • all:表示全表掃描,表示沒有使用索引,需要對整個表進行遍歷來找到匹配條件的記錄。通常出現在沒有適用的索引、謂詞或查詢涉及表的大部分或全部數據的情況。
explain SELECT * FROM tb_user;

4. Mysql慢查詢定位面試題

面試官:MySQL中,如何定位慢查詢?

候選人:

我們當時做壓測的時候有的接口非常的慢,接口的響應時間超過了2秒以上,因為我們當時的系統部署了運維的監控系統Skywalking ,在展示的報表中可以看到是哪一個接口比較慢,并且可以分析這個接口哪部分比較慢,這里可以看到SQL的具體的執行時間,所以可以定位是哪個sql出了問題。

如果,項目中沒有這種運維的監控系統,其實在MySQL中也提供了慢日志查詢的功能,可以在MySQL的系統配置文件中開啟這個慢日志的功能,并且也可以設置SQL執行超過多少時間來記錄到一個日志文件中,我記得上一個項目配置的是2秒,只要SQL執行的時間超過了2秒就會記錄到日志文件中,我們就可以在日志文件找到執行比較慢的SQL了。

面試官:那這個SQL語句執行很慢, 如何分析呢?

候選人:

如果一條sql執行很慢的話,我們通常會使用mysql自動的執行計劃explain來去查看這條sql的執行情況,比如在這里面可以通過key和key_len檢查是否命中了索引,如果本身已經添加了索引,也可以判斷索引是否有失效的情況,第二個,可以通過type字段查看sql是否有進一步的優化空間,是否存在全索引掃描或全盤掃描,第三個可以通過extra建議來判斷,是否出現了回表的情況,如果出現了,可以嘗試添加索引或修改返回字段來修復

責任編輯:華軒 來源: pringboot葵花寶典
相關推薦

2021-04-07 10:38:43

MySQL數據庫命令

2020-09-13 13:05:41

MySQL慢查詢數據

2020-06-05 09:21:20

MySQL慢查詢數據庫

2011-06-28 08:32:40

MySQL慢查詢日志

2019-12-17 10:16:34

MySQLSQL優化數據庫

2022-07-28 09:13:30

MySQL數據庫

2013-10-29 16:27:23

MySQLSQL語句

2018-09-13 09:42:30

數據庫Redis慢查詢

2010-11-04 09:43:46

LINQ to SQL

2022-02-11 14:43:53

SQL語句C/S架構

2022-09-01 16:42:47

MySQL數據庫架構

2010-11-25 11:07:28

MySQL慢查詢

2022-04-10 23:42:33

MySQLSQL數據庫

2017-09-07 16:20:39

SQL查詢語句查詢優化

2024-12-17 06:20:00

MySQLSQL語句數據庫

2010-04-19 09:37:22

Oracle查詢語句

2019-11-06 09:30:35

SQL查詢語句數據庫

2018-09-20 11:54:31

數據庫MySQL性能優化

2016-12-15 09:58:26

優化SQL高性能

2017-07-12 13:04:23

數據庫SQL查詢執行計劃
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天久久| 四虎永久影院 | 狠狠操狠狠| 涩涩视频网站在线观看 | 国产欧美精品一区 | 91精品国产一区二区三区 | 国产一区999 | 国产在线视频一区二区 | 九九综合九九 | 2023亚洲天堂 | 亚洲福利 | 91免费观看视频 | 国产免费一区 | 国产一区二区三区精品久久久 | 亚洲高清视频一区二区 | 狠狠干2020| 国产人成精品一区二区三 | 日韩欧美中文字幕在线观看 | 99re视频在线| 毛片免费观看 | 国产yw851.c免费观看网站 | 午夜在线 | 激情久久网 | 性在线 | 国产精品久久福利 | 国产精品国产三级国产aⅴ中文 | 亚洲欧美日韩久久 | 在线免费看黄 | 成年人国产在线观看 | 精品久久成人 | 一区二区三区精品视频 | 亚洲福利在线视频 | 天天操天天射综合网 | 国产精品小视频在线观看 | 日韩三区 | 久久网一区二区 | 免费一区二区三区 | 99久久国产精 | 狠狠亚洲| 米奇成人网 | 在线视频一区二区 |