MySQL資料庫的性能分析 ---圖書《軟體性能測試分析與調優實踐之路》-手稿節選

来源:https://www.cnblogs.com/laoqing/archive/2022/11/11/16880718.html
-Advertisement-
Play Games

1 、MySQL資料庫的性能監控 1.1、如何查看MySQL資料庫的連接數 連接數是指用戶已經創建多少個連接,也就是MySQL中通過執行 SHOW PROCESSLIST命令輸出結果中運行著的線程個數的詳情,如圖所示。 SHOW PROCESSLIST預設情況下只顯示前100條記錄的詳情,如果超過1 ...


1  、MySQL資料庫的性能監控

1.1、如何查看MySQL資料庫的連接數

連接數是指用戶已經創建多少個連接,也就是MySQL中通過執行 SHOW  PROCESSLIST命令輸出結果中運行著的線程個數的詳情,如圖所示。

SHOW PROCESSLIST預設情況下只顯示前100條記錄的詳情,如果超過100條後需要顯示所有,可以通過執行SHOW  FULL  PROCESSLIST命令,如圖所示。

 

show variables like 'max_connections'可以查詢資料庫中可以支持的最大連接數,如圖所示。

本文作者:張永清, 轉載請註明: https://www.cnblogs.com/laoqing/p/16880718.html  來源於博客園 ,本文摘選自《軟體性能測試分析與調優實踐之路》

 show global status like 'max_used_connections'可以查詢當前已經使用過的最大連接數,如圖所示。

 1.2、如何查看MySQL資料庫當前運行的事務與鎖

事務是對資料庫執行一種帶有原子性、一致性、隔離性、持久性的數據操作,在MySQL中如果需要使用事務,那麼數據存儲時必須選用MySQL的innodb引擎,使用innodb引擎後,在MySQL系統資料庫information_schema的innodb_trx表中記錄了資料庫當前正在運行的事務。

innodb_trx表中包含的常用欄位說明如表所示。

表 innodb_trx表中包含的常用欄位說明

欄位

描述

trx_id

事務ID

trx_state

事務的狀態,一般包括RUNNING、LOCK WAIT、ROLLING BACK 和 COMMITTING著幾種不同的狀態

trx_started

事務開始運行的時間

trx_requested_lock_id

事務需要等待的但已經被別的程式鎖定的資源id,一般可以和INNODB_LOCKS表關聯在一起獲取更多的被鎖定的資源的詳細信息

trx_wait_started

事務開始等待時間

trx_mysql_thread_id

事務對應的MySQL線程id

trx_query

事務正在執行的SQL語句

trx_operation_state

事務操作的狀態

trx_tables_in_use

事務使用到的資料庫表的數量

trx_tables_locked

事務鎖定的資料庫表的數量

trx_rows_locked

事務鎖定的數據記錄行數

trx_rows_modified

事務更改的數據記錄行數

trx_unique_checks

事務是否打開唯一性檢查的標識

 

trx_foreign_key_checks

事務是否打開外鍵檢查的標識

 

trx_isolation_level

事務隔離級別,一般分為Read Uncommitted(未提交讀取)、Read Committed(已提交讀取)、Repeatable Read(可重覆讀取)、Serializable(序列化)四種不同的級別

trx_weight

事務的權重

trx_lock_memory_bytes

事務鎖住的記憶體大小,單位為 位元組

trx_concurrency_tickets

事務併發票數

trx_last_foreign_key_error

 

事務最後一次的外鍵檢查的錯誤信息

 

MySQL系統資料庫information_schema的 innodb_locks表中記錄了innodb資料庫引擎當前產生的鎖的情況, innodb_locks表中包含的常用欄位說明如表所示。

欄位

描述(本文作者:張永清, 轉載請註明: https://www.cnblogs.com/laoqing/p/16880718.html  來源於博客園 ,本文摘選自《軟體性能測試分析與調優實踐之路》

lock_id

鎖的id

lock_trx_id

擁有鎖的事務 ID。可以和 INNODB_TRX 表關聯查詢得到事務的詳細信息

lock_mode

鎖的模式,鎖的模式一般包含:

行級鎖:包括S(共用鎖)、X(排它鎖)、IS(意向共用鎖)、IX(意向排它鎖)。

表級鎖:包括S_GAP(共用間隙鎖)、X_GAP(排它間隙鎖)、IS_GAP(意向共用間隙鎖)、IX_GAP(意向排它間隙鎖) 和 AUTO_INC(自動遞增鎖)

lock_type

鎖的類型。包括RECORD(行級鎖)和TABLE(表級鎖)

lock_table

當前被鎖定的或者包含鎖定記錄的表的名稱

lock_index

當 LOCK_TYPE為RECORD 時,表示鎖定的索引的名稱,否則直接返回NULL

lock_space

當 LOCK_TYPE為RECORD 時,表示鎖定行的表空間 ID,否則直接返回NULL

lock_page

當 LOCK_TYPE為RECORD時,表示鎖定記錄行的頁數,否則直接返回NULL

lock_rec

當 LOCK_TYPE為RECORD時,表示鎖定的數據行的數量

lock_data

當 LOCK_TYPE為RECORD時,表示鎖定記錄行的主鍵

MySQL系統資料庫information_schema的innodb_lock_waits表中記錄了innodb資料庫引擎當前運行的資料庫事務等待鎖的情況,innodb_lock_waits表中包含的常用欄位說明如表所示。本文作者:張永清, 轉載請註明: https://www.cnblogs.com/laoqing/p/16880718.html  來源於博客園 ,本文摘選自《軟體性能測試分析與調優實踐之路》

表innodb_lock_waits表中包含的常用欄位說明

欄位

描述

requesting_trx_id

請求事務的 ID

Requested_lock_id

事務所等待的鎖定的 ID。可以和 INNODB_LOCKS 表關聯查詢

Blocking_trx_id

阻塞事務的 ID

Blocking_lock_id

阻塞了另一事務的運行的事務的鎖的 ID

在資料庫中出現死鎖時,經常需要通過查詢innodb_trx、innodb_locks、innodb_lock_waits這三張表來找出在執行什麼事務操作時導致了死鎖,例如執行如下SQL可以列出資料庫中所有事務的等待和鎖定記錄。

--本文作者:張永清, 轉載請註明: https://www.cnblogs.com/laoqing/p/16880718.html  
--來源於博客園 ,本文摘選自《軟體性能測試分析與調優實踐之路》
SELECT
r.trx_isolation_level,/*事務隔離級別*/ r.trx_id AS waiting_trx_id,/*正處於等待中的事務id*/ r.trx_mysql_thread_id AS waiting_trx_thread, /*正處於等待中的資料庫線程id*/ r.trx_state AS waiting_trx_state, /*正處於等待中的事務的狀態*/ lr.lock_mode AS waiting_trx_lock_mode,/*正處於等待中的事務的鎖定模式*/ lr.lock_type AS waiting_trx_lock_type,/*正處於等待中的事務的鎖定類型*/ lr.lock_table AS waiting_trx_lock_table,/*正處於等待中的事務將鎖定的表*/ lr.lock_index AS waiting_trx_lock_index,/*正處於等待中的事務將鎖定的索引*/ r.trx_query AS waiting_trx_SQL,/*正處於等待中的事務將執行的SQL*/ b.trx_id AS blocking_trx_id,/*正處於鎖定中的事務id*/ b.trx_mysql_thread_id AS blocking_trx_thread,/*正處於鎖定中的線程id*/ b.trx_state AS blocking_trx_state,/*正處於鎖定中的事務的狀態*/ lb.lock_mode AS blocking_trx_lock_mode,/*正處於鎖定中的事務的鎖定模式*/ lb.lock_type AS blocking_trx_lock_type,/*正處於鎖定中的事務的鎖定類型*/ lb.lock_table AS blocking_trx_lock_table,/*正處於鎖定中的事務已經鎖定的表*/ lb.lock_index AS blocking_trx_lock_index,/*正處於鎖定中的事務已經鎖定的索引*/ b.trx_query AS blocking_sql /*正處於鎖定中的事務在執行的SQL*/ FROM information_schema.innodb_lock_waits wt INNER JOIN information_schema.innodb_trx b ON b.trx_id = wt.blocking_trx_id INNER JOIN information_schema.innodb_trx r ON r.trx_id = wt.requesting_trx_id INNER JOIN information_schema.innodb_locks lb ON lb.lock_trx_id = wt.blocking_trx_id INNER JOIN information_schema.innodb_locks lr ON lr.lock_trx_id = wt.requesting_trx_id;

1.3、MySQL中資料庫表的監控

  •  1、查看資料庫中當前打開了哪些表: show OPEN TABLES ,如圖所示。另外還可以通過show OPEN TABLES where In_use > 0過濾出當前已經被鎖定的表。

  •  2、查看資料庫中表的狀態:SHOW STATUS LIKE  '%table%',如圖所示。需要特別註意的是Table_locks_waited  指的是不能立即獲取表級鎖而需要等待的次數,如果等待的次數非常大則說明可能存在鎖爭搶的情況,如果是頻繁的出現鎖爭搶則對應用程式的併發性能影響很大。

 

  • 3、查看資料庫中鎖的信息:SHOW STATUS LIKE '%lock%',如圖所示。

 

  • 4、查看資料庫中的表被掃描的情況:show global status like 'handler_read%',如圖所示,查詢的結果數據也可以用來評估資料庫中索引的使用情況。查詢的結果數據說明如表所示。

 

查詢結果項

描述

Handler_read_first

從索引中讀取第一項的次數,如果該值非常高,表明伺服器正在執行大量的全索引掃描,該值一般不宜太高

Handler_read_key

基於鍵讀取數據行的請求數,該值如果越高則表明大量的查詢都走了索引。如果越低,表示索引的利用很低,該值一般越高越好

Handler_read_last

讀取索引中最後一個鍵的請求數

Handler_read_next

按鍵順序讀取下一行的請求數,如果查詢都走了索引,那麼該值將不斷遞增

Handler_read_prev

按鍵順序讀取前一行的請求數(倒序讀取數據),一般用於評估執行ORDER BY … DESC的次數

Handler_read_rnd

基於固定位置讀取數據行的請求數,如果正在執行大量的需要對查詢結果進行排序的查詢,則此值很高。如果該值很高,則可能存在很多查詢需要做整表掃描或者查詢時一些表的關聯連接沒有正確使用主鍵或者索引

Handler_read_rnd_deleted

從資料庫數據文件中讀取被刪除記錄行的請求數

Handler_read_rnd_next

從資料庫數據文件中讀取下一行的請求數,如果SQL語句執行大量表掃描,則此值很高。如果該值很高,一般說明表沒有正確添加索引或者SQL語句沒有走索引來查詢

1.4、性能測試時MySQL中其他常用監控 

  • 1、查看每秒事務的提交數:show global status like 'com_commit',如圖所示

 

  • 2、查看每秒事務的回滾數:show global status like 'com_rollback',如圖所示

 

  •  3、查看線程的運行情況:show global status like 'threads_%',如圖所示。

查詢結果描述說明如表所示。

表查詢結果描述說明

查詢結果項

描述

Threads_cached

線程緩存中的線程數

Threads_connected

已經建立連接的線程數

Threads_created

已經創建的線程數

Threads_running

正在運行中的線程數

  • 4、查看資料庫建立過的連接總數(包括連接中以及已經斷開的連接):show global status like 'Connections',如圖所示。

  •  5、查看innodb引擎緩存命中情況:show global status like 'innodb_buffer_pool_read%',如圖所示。

  • 6、 查看join操作時全表掃描的次數:show global status like 'select_full_join',如圖所示,該值一般可以表示SQL語句中的join操作沒有走索引的次數,如果值非常大,那可能是SQL語句中的join操作存在性能問題。

  • 7、 查看SQL中排序使用情況:show global status like 'sort%',如圖所示

  • 8、 查看SQL查詢緩存的命中情況:show global status like 'qcache%',如圖所示。

如果需要查詢資料庫查詢緩存的設置,可以通過show variables like 'query_cache%'進行查看,如圖所示。

備註:MySQL資料庫中大部分的運行狀態都可以通過show status和show global status來查看,二者的區別在於前者是查詢當前的運行狀態,後者是查詢全局的運行狀態,也就是資料庫開始啟動運行到現在為止的狀態。

2、MySQL資料庫的性能定位

2.1、慢SQL

慢SQL 一般指查詢很慢的SQL語句,在MySQL資料庫中,可以通過慢查詢來查看所有執行超時的SQL語句,在預設情況下,一般慢SQL 是關閉的,可以通過執行show variables like 'slow_query%'來查看資料庫是否開啟了慢查詢,如圖所示。

從圖中看到slow_query_log的值為OFF表示未開啟,可以通過執行 set global slow_query_log=1; 或者 set global slow_query_log=ON;來臨時開啟慢查詢,如圖所示。

如果需要永久開啟,需要修改/etc/my.cnf配置文件,在[mysqld]處加入如下配置,然後重啟資料庫即可生效,如圖所示。

slow_query_log=ON

slow_query_log_file=/var/lib/mysql/localhost-slow.log

 

修改完成重啟資料庫後,再次執行show variables like 'slow_query%',發現慢查詢已經被開啟,如圖所示。

 

通過執行show variables like 'long_query%';可以查詢慢查詢的記錄時間,如圖所示,預設是10秒,可以通過執行set long_query_time=需要修改的時長;來修改慢查詢的記錄時間。

 

通過執行show status like 'slow_queries';可以查看慢查詢發生的次數,如圖所示。

從慢查詢日誌中,我們也可以看到慢查詢發生的詳細信息,如圖所示,慢查詢日誌中會記錄每次慢查詢發生的時間、執行查詢時的資料庫用戶、線程id、查詢執行的SQL語句等信息。

本文作者:張永清, 轉載請註明: https://www.cnblogs.com/laoqing/p/16880718.html  來源於博客園 ,本文摘選自《軟體性能測試分析與調優實踐之路》

在獲取到慢查詢的SQL語句後,就可以藉助資料庫的執行計劃來對慢查詢的SQL語句做進一步分析了。

 2.2、執行計劃

在MySQL中使用explain關鍵字可以模擬查看資料庫是如何來執行SQL查詢語句,也就是常說的查看一條SQL語句在資料庫中的執行計劃,如圖6-2-8所示就是執行EXPLAIN

本文作者:張永清, 轉載請註明: https://www.cnblogs.com/laoqing/p/16880718.html  來源於博客園 ,本文摘選自《軟體性能測試分析與調優實踐之路》

SELECT * FROM  test.test 後返回的SELECT * FROM  test.test查詢的執行計劃。

 

查詢結果返回的欄位說明如表所示 

表查詢結果返回的欄位說明

欄位

說明

id

查詢的順序編號,表示查詢中執行的順序,id的值越大執行的優先順序越高,如果id相同,則從上往下執行

select_type

查詢類型,常見查詢類型如下:

SIMPLE:表示簡單查詢方式,SQL語句中一般不會不使用UNION和子查詢等

PRIMARY:表示當查詢中包含子查詢時,最外層的查詢語句則被標記為primary 。

UNION:查詢語句中如果在UNION關鍵字之後出現了第二個SELECT,則被標記為UNION。

UNION RESULT:表示查詢中有多個查詢結果集做UNION操作。

DEPENDENT UNION:表示子查詢中存在UNION操作時,從UNION之後的第二個及之後的SELECT語句都是DEPENDENT UNION。

DEPENDENT SUBQUERY:子查詢中UNION 中第一個SELECT查詢為DEPENDENT SUBQUERY。

SUBQUERY:子查詢內層查詢的第一個SELECT。

DERIVED:查詢語句中如果from子句的子查詢中出現了union關鍵字則外層select查詢將被標記為DERIVED。

MATERIALIZED:表示子查詢被物化。

UNCACHEABLE SUBQUERY:表示查詢結果集無法緩存的子查詢,需要逐次查詢。

UNCACHEABLE UNION:表示子查詢不可被物化,需要逐次運行

Table

查詢涉及的表名或者表的別名

本文作者:張永清, 轉載請註明: https://www.cnblogs.com/laoqing/p/16880718.html  來源於博客園 ,本文摘選自《軟體性能測試分析與調優實踐之路》

Type

表示表連接的類型,包括的類型如下所示,如下的這些類型的性能從高到低的順序是:null→system→const→eq-ref→ref→fulltext→ref_or_null→index_merge→unique_subquery→index_subquery→range→index→ALL

null:表示不訪問任何的表

system:表示表中只有一條記錄,相當於系統表,一般可以認為是const類型的特例。

const:表示主鍵或者唯一索引的常量查詢,表中最多只有1行記錄符合查詢要求,通常const使用到主鍵或者唯一索引進行定值查詢、常量查詢,查詢的速度非常快。

eq_ref:表示join 查詢過程中,關聯條件欄位走主鍵或者唯一索引,出來的行數不止一行。eq_ref是一種查詢性能很高的 join 操作。

ref:表示非聚集索引的常量查詢

fulltext:表示查詢的過程中,使用到了 fulltext 索引。

ref_or_null:跟ref查詢類似,在ref的查詢基礎上會多家一個null值的條件查詢

index merg:表示索引聯合查詢,

unique subquery:表示查詢走主鍵的子查詢

index subquery:表示查詢走非聚集索引的子查詢

range:表示查詢走索引範圍的查詢,一般包括:=、<>、>、>=、<、<=、IS NULL、BETWEEN、IN、<=> 等範圍。

index:表示通過索引做掃描查詢。

All:表示全表掃描,性能最差

possible_keys

查詢時預計可能會使用的索引,這裡說的索引只是可能會用到,實際查詢不一定會用到。

Key

實際查詢時真實使用的索引

key_len

使用的索引長度

Ref

關聯信息

Rows

查詢時掃描的數據記錄行數

Extra

表示查詢特性的使用情況,常用的查詢特性如下所示。

Using index:表示使用了索引

Using index conditio:表示使用了索引做過濾

Using MRR:表示使用了索引做內部排序

Using where:表示使用了where條件

Using temporary:表示使用了臨時表。

Using filesort:表示使用文件排序,一般指無法利用索引來完成的排序

本文作者:張永清, 轉載請註明: https://www.cnblogs.com/laoqing/p/16880718.html  來源於博客園 ,本文摘選自《軟體性能測試分析與調優實踐之路》

 

 

作者的原創文章,轉載須註明出處。原創文章歸作者所有,歡迎轉載,但是保留版權。對於轉載了博主的原創文章,不標註出處的,作者將依法追究版權,請尊重作者的成果。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前後端分離開發,必須解決跨域問題! 跨域:對於 url 如 http://localhost:8080,請求協議、ip 地址、埠號,只要發送請求方和接收請求方的這三個數據中,只要有一個不同,就表示是跨域訪問! AJAX 跨域訪問:用戶訪問 A 網站時所產生的對 B 網站的跨域訪問請求均提交到 A ...
  • 逆向目標 猿人學 - 反混淆刷題平臺 Web 第二題:js 混淆,動態 cookie 目標:提取全部 5 頁發佈日熱度的值,計算所有值的加和 主頁:https://match.yuanrenxue.com/match/2 介面:https://match.yuanrenxue.com/api/mat ...
  • gRPC JSON轉碼 gRPC JSON 轉碼允許瀏覽器應用調用 gRPC 服務,就像它們是使用 JSON 的 RESTful API 一樣。 瀏覽器應用不需要生成 gRPC 客戶端或瞭解 gRPC 的任何信息。 通過使用 HTTP 元數據註釋 .proto 文件,可從 gRPC 服務自動創建 R ...
  • 2022年11月8日.NET 7正式發佈 .NET仍然是最快、最受歡迎、最值得信賴的平臺之一,其龐大的.NET軟體包生態系統包括33萬多個軟體包。 .NET 7為您的應用程式帶來了更高的性能和C# 11/F# 7、.NET MAUI、ASP.NET Core/Blazor、Web APIs、WinF ...
  • 什麼是Path環境變數? 在探討這個問題之前,我們需要瞭解什麼是環境變數。 “環境變數”和“path環境變數”其實是兩個東西,這一點大家一定要區分開,不要混為一談。 “環境變數”是操作系統工作環境設置的一些選項或屬性參數。每個環境變數由變數名和文件路徑組成的,可以設置很多個環境變數。 我們一般使用環 ...
  • AIR32F103CBT6的存儲容量加上206MHz頻率, 跑RTOS才能充分利用它的性能. 關於FreeRTOS的介紹和集成, 網路上已經有不少文章, 可以直接百度搜索查看, 這裡主要介紹一下項目中的FreeRTOS集成步驟和代碼說明. ...
  • 在物聯網、監控、感測器、金融等應用領域,數據在時間維度上流式的產生,而且數據量非常龐大。 例如我們經常看到的性能監控視圖,就是很多點在時間維度上描繪的曲線。 又比如金融行業的走勢數據等等。 我們想象一下,如果每個感測器或指標每100毫秒產生1個點,一天就是864000個點。 而感測器或指標是非... ...
  • 你聽過多少款無伺服器架構(Serverless)資料庫? 什麼是Serverless呢?簡單理解,Serverless 分為 FaaS 和 BaaS 兩個部分,其中 FaaS 指的是函數即服務,BaaS 是後端即服務。 舉個例子,用戶瀏覽網頁,可能涉及CDN資源。如果是靜態內容,從對象存儲下載照片、 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...