MySQL explain 和 profiling 詳解

来源:https://www.cnblogs.com/bmft/archive/2023/04/05/17290555.html
-Advertisement-
Play Games

MySQL explain 和 profiling 詳解 mysql explain MySQL 的 EXPLAIN 是一個用於查詢優化的工具,它可以顯示 MySQL 資料庫如何執行查詢。它返回一組關於查詢執行計劃的信息,包括用到的索引,表的連接順序以及 MySQL 使用的查詢類型。下麵是 EXPL ...


MySQL explain 和 profiling 詳解

mysql explain

MySQL 的 EXPLAIN 是一個用於查詢優化的工具,它可以顯示 MySQL 資料庫如何執行查詢。它返回一組關於查詢執行計劃的信息,包括用到的索引,表的連接順序以及 MySQL 使用的查詢類型。下麵是 EXPLAIN 返回的列及其含義:

id

id:查詢中每個 SELECT 子句或者操作的唯一標識符。如果 id 相同,那麼這些操作在同一個查詢中。

select_type

  • select_type:查詢的類型,有以下幾種類型:
    • SIMPLE:簡單 SELECT 查詢,不使用 UNION 或子查詢等。
    • PRIMARY:最外層的查詢,即包含了子查詢的查詢。
    • UNION:UNION 查詢的第二個或後續查詢語句,不包括第一個查詢語句。
    • DEPENDENT UNION:UNION 查詢中的第二個或後續查詢語句,依賴於外部查詢的結果。
    • UNION RESULT:UNION 的結果集。
    • SUBQUERY:子查詢中的第一個 SELECT 語句,結果用於外部查詢。
    • DEPENDENT SUBQUERY:子查詢中的第一個 SELECT 語句,依賴於外部查詢的結果。
    • DERIVED:派生表的 SELECT,MySQL 會將其存儲在臨時表中。
    • MATERIALIZED:派生表的 SELECT,MySQL 會將其存儲在臨時表中。
    • UNCACHEABLE SUBQUERY:子查詢不可緩存。
  • table:顯示查詢的表名。
  • partitions:匹配到查詢的分區列表。
  • type:表訪問的類型,性能從好到壞依次是:
    • system:僅有一行記錄的表。
    • const:基於索引進行的等值查詢。
    • eq_ref:對於每個查詢,使用了索引查找符合條件的一行。
    • ref:非唯一性索引查找,返回匹配某個單獨值的所有行。
    • range:使用索引查找一定範圍內的行。
    • index:使用索引掃描全表,一般用於ORDER BY和GROUP BY操作。
    • all:全表掃描。
  • possible_keys:可能使用的索引列表。
  • key:實際使用的索引名稱。
  • key_len:使用索引的長度。
  • ref:顯示索引的哪一列或常量與表列進行比較。
  • rows:估算的行數。
  • filtered:過濾器過濾的行數百分比。
  • Extra:關於 MySQL 如何解析查詢的額外信息,包括以下信息:
    • Using index:表示查詢中使用了覆蓋索引。
    • Using where:表示 MySQL 使用了 WHERE 子句來過濾數據。
    • Using temporary:表示 MySQL 使用了臨時表來存儲結果集,通常是 GROUP BY 和 ORDER BY 操作的結果。
    • Using filesort:表示 MySQL 使用了文件排序來排序結果集。
    • Using join buffer:表示
    • Using join buffer:表示 MySQL 使用了 join buffer 來處理連接操作。
    • Using sort_union:表示 MySQL 使用了 UNION 查詢中的排序優化。
    • Using intersect:表示 MySQL 使用了 UNION 查詢中的交集優化。
    • Using index condition:表示 MySQL 使用了索引中的條件進行過濾,這意味著 MySQL 能夠在索引中解決查詢條件,而無需查找表中的行。
    • Using where with pushed condition:表示 MySQL 將過濾條件下推到了聯接前的表中,這可能會更有效地利用索引。
    • Using index for group-by:表示 MySQL 使用了索引來處理 GROUP BY 操作,這通常是一種優化。
    • Using filesort for group-by:表示 MySQL 使用了文件排序來處理 GROUP BY 操作,這通常是不太理想的。
    • Using temporary for filesort:表示 MySQL 使用了臨時表來處理 ORDER BY 或 GROUP BY 操作的結果。
    • Using filesort for order by:表示 MySQL 使用了文件排序來處理 ORDER BY 操作,這通常是不太理想的。

下麵是一個使用 EXPLAIN 進行查詢優化的例子:

EXPLAIN SELECT *
FROM users
JOIN orders ON users.id = orders.user_id
WHERE users.age > 18
ORDER BY orders.created_at DESC
LIMIT 10;

執行上面的語句後,會返回類似如下的輸出:

sql
Copy code
+----+-------------+--------+------------+--------+---------------------+---------+---------+------------------------+------+----------+--------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+--------+------------+--------+---------------------+---------+---------+------------------------+------+----------+--------------------------+
| 1 | SIMPLE | users | NULL | range | PRIMARY,age | age | 4 | NULL | 4 | 100.00 | Using where; Using index |
| 1 | SIMPLE | orders | NULL | ref | user_id,created_at | user_id | 4 | test_db.users.id | 199 | 100.00 | Using index |
+----+-------------+--------+------------+--------+---------------------+---------+---------+------------------------+------+----------+--------------------------+

這個查詢通過 JOIN 將用戶表和訂單表連接起來,只返回年齡大於 18 歲的用戶的前 10 個訂單,按照訂單創建時間倒序排序。通過分析輸出結果,我們可以看到 MySQL 使用了用戶表的 age 列上的索引來過濾數據,然後使用了訂單表的 user_id 列上的索引來查找訂單,這個查詢使用了索引優化的方法,可以更高效地執行。

MySQL profiling

# 查看是否開啟了 profiling
show variables like '%profiling%';
# 開啟 profiling
set profiling = 1;
# 執行查詢

select * from big_tables where id >= (
    select id from big_tables limit 10000000, 1
) limit 0, 1;

# 查看所有查詢的性能數據
show profiles;
# 查看某條查詢的詳細性能數據
show profile for query 1;
# 查看 cpu, io, memory, block io 等性能數據
show profile cpu, io, memory, block io for query 1;

# 關閉 profiling
set profiling = 0;

使用示例:

mysql> # 查看所有查詢的性能數據
show profiles;
+----------+------------+---------------------------------------------------------------------------------------------------+
| Query_ID | Duration   | Query                                                                                             |
+----------+------------+---------------------------------------------------------------------------------------------------+
|        1 | 0.00568250 | show variables like '%profiling%'                                                                 |
|        2 | 1.41488150 | select * from big_tables where id >= (
    select id from big_tables limit 10000000, 1
) limit 0, 1 |
|        3 | 0.00040300 | purge profiles                                                                                    |
|        4 | 0.00016575 | # 清理所有profiling 數據
FLUSH STATEMENT ANALYSIS                                                  |
|        5 | 0.00014875 | FLUSH STATEMENT ANALYSIS                                                                          |
|        6 | 1.41070725 | select * from big_tables where id >= (
    select id from big_tables limit 10000000, 1
) limit 0, 1 |
+----------+------------+---------------------------------------------------------------------------------------------------+
6 rows in set (0.10 sec)
mysql> # 查看某條查詢的詳細性能數據
show profile for query 6;
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000098 |
| Executing hook on transaction  | 0.000034 |
| starting                       | 0.000030 |
| checking permissions           | 0.000009 |
| checking permissions           | 0.000005 |
| Opening tables                 | 0.000059 |
| init                           | 0.000027 |
| System lock                    | 0.000015 |
| optimizing                     | 0.000010 |
| statistics                     | 0.000024 |
| optimizing                     | 0.000004 |
| statistics                     | 0.000008 |
| preparing                      | 0.000016 |
| executing                      | 1.410089 |
| preparing                      | 0.000041 |
| executing                      | 0.000037 |
| end                            | 0.000006 |
| query end                      | 0.000042 |
| waiting for handler commit     | 0.000016 |
| closing tables                 | 0.000014 |
| freeing items                  | 0.000110 |
| cleaning up                    | 0.000019 |
+--------------------------------+----------+
mysql> # 查看 cpu, io, memory, block io 等性能數據
show profile cpu, block io for query 6;
+--------------------------------+----------+----------+------------+--------------+---------------+
| Status                         | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |
+--------------------------------+----------+----------+------------+--------------+---------------+
| starting                       | 0.000098 | 0.000072 | 0.000025   |            0 |             0 |
| Executing hook on transaction  | 0.000034 | 0.000026 | 0.000009   |            0 |             0 |
| starting                       | 0.000030 | 0.000022 | 0.000007   |            0 |             0 |
| checking permissions           | 0.000009 | 0.000006 | 0.000002   |            0 |             0 |
| checking permissions           | 0.000005 | 0.000004 | 0.000002   |            0 |             0 |
| Opening tables                 | 0.000059 | 0.000044 | 0.000015   |            0 |             0 |
| init                           | 0.000027 | 0.000020 | 0.000007   |            0 |             0 |
| System lock                    | 0.000015 | 0.000010 | 0.000003   |            0 |             0 |
| optimizing                     | 0.000010 | 0.000008 | 0.000003   |            0 |             0 |
| statistics                     | 0.000024 | 0.000018 | 0.000006   |            0 |             0 |
| optimizing                     | 0.000004 | 0.000002 | 0.000001   |            0 |             0 |
| statistics                     | 0.000008 | 0.000006 | 0.000002   |            0 |             0 |
| preparing                      | 0.000016 | 0.000012 | 0.000004   |            0 |             0 |
| executing                      | 1.410089 | 1.412984 | 0.000000   |            0 |             0 |
| preparing                      | 0.000041 | 0.000038 | 0.000000   |            0 |             0 |
| executing                      | 0.000037 | 0.000037 | 0.000000   |            0 |             0 |
| end                            | 0.000006 | 0.000005 | 0.000000   |            0 |             0 |
| query end                      | 0.000042 | 0.000042 | 0.000000   |            0 |             0 |
| waiting for handler commit     | 0.000016 | 0.000016 | 0.000000   |            0 |             0 |
| closing tables                 | 0.000014 | 0.000014 | 0.000000   |            0 |             0 |
| freeing items                  | 0.000110 | 0.000109 | 0.000000   |            0 |             0 |
| cleaning up                    | 0.000019 | 0.000019 | 0.000000   |            0 |             0 |
+--------------------------------+----------+----------+------------+--------------+---------------+
22 rows in set (0.17 sec)

拓展: profiling 數據的條數

一般 profiling 只保留最近 15 條查詢的性能數據, 如果需要保留更多的數據, 可以修改 profiling_history_size 變數:

mysql> show variables like '%profiling%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| have_profiling         | YES   |
| profiling              | ON    |
| profiling_history_size | 15    |
+------------------------+-------+
3 rows in set (0.10 sec)
mysql> set global profiling_history_size=20;

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

-Advertisement-
Play Games
更多相關文章
  • 一、說明 在SimpleAdmin1.0版本中,我將整體項目結構分為三大塊,分別為架構核心、業務模塊和應用服務。隨著1.0版本的封版,回去再看我之前的項目架構,也暴露了一些問題,比如在1.0版本中,Signalr和Mqtt只能二選一,這顯然是不科學的,因為這兩種雖然都可以作為消息通知,但是顯然可以有 ...
  • .NET是一種用於構建多種應用的免費開源開發平臺,可以使用多種語言,編輯器和庫開發Web應用、Web API和微服務、雲中的無伺服器函數、雲原生應用、移動應用、桌面應用、Windows WPF、Windows窗體、通用 Windows平臺 (UWP)、游戲、物聯網 (IoT)、機器學習、控制台應用、 ...
  • 前編 一般來說, 泛型的作用就類似一個占位符, 或者說是一個參數, 可以讓我們把類型像參數一樣進行傳遞, 儘可能地復用代碼 我有個朋友, 在使用的過程中發現一個問題 IFace<object> item = new Face<string>(); // CS0266 public interface ...
  • Intro EF Core支持多種方式處理具有繼承關係的表,現在支持TPH、TPC(EF Core 7)、TPT,具體的實現方式可以參考官方文檔和這篇文章。 大致總結一下不同的方式的區別: TPH:所有的類型都放在一張表中,使用discriminator欄位用以區別不同的類型 TPT:不同的子類型有 ...
  • 作者:袁首京 原創文章,轉載時請保留此聲明,並給出原文連接。 如果您是電腦相關從業人員,那麼應該經歷不止一次網路安全專項檢查了,你肯定是收到過信息系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ...
  • 1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從巨集觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用於零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ...
  • 1、虛擬化平臺虛擬機添加硬碟 系統查看添加的硬碟 [root@yumserver ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8: ...
  • 1. 按照現在的SQL標準來說,HAVING子句是可以單獨使用的 1.1. 就不能在SELECT子句里引用原來的表裡的列了 1.1.1. 使用常量 1.1.2. 使用聚合函數 1.2. WHERE子句用來調查集合元素的性質,而HAVING子句用來調查集合本身的性質 2. 表不是文件,記錄也沒有順序, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...