MySQL EXPLAIN 查看執行計劃詳解

MySQL 的?EXPLAIN?命令。這是一個分析和優化 SQL 查詢性能不可或缺的強大工具。它展示了 MySQL 如何執行一條 SQL 語句,包括如何使用索引、表連接順序、估計的行數等關鍵信息。

1. 如何使用 EXPLAIN

在你要分析的?SELECT?語句前加上?EXPLAIN?或?EXPLAIN FORMAT=JSON(獲取更詳細的 JSON 格式信息)即可。

EXPLAIN SELECT * FROM users WHERE age > 30;

或者用于分析連接查詢:

EXPLAIN SELECT u.name, o.order_id 
FROM users u
INNER JOIN orders o ON u.id = o.user_id
WHERE u.country = 'China';

2. EXPLAIN 輸出列詳解

執行?EXPLAIN?后,會返回一個包含多列的結果集。每一列都描述了執行計劃的一個特定方面。以下是這些列的詳細解釋,按重要性排序:

列名描述
id查詢中每個?SELECT?子句的唯一標識符。
select_typeSELECT?語句的類型(簡單、子查詢、聯合等)。
table正在訪問的表名。
partitions匹配的分區。如果表未分區,則為?NULL
type?(非常重要)連接類型?或?訪問類型。這是衡量查詢效率的關鍵指標,從最優到最差排列。
possible_keysMySQL 可能選擇用來查找該表的索引。
keyMySQL?實際決定使用的索引。如果為?NULL,則未使用索引。
key_len所使用的索引的長度(字節數)。用于判斷是否充分利用了索引(例如,復合索引使用了最左前綴的多少部分)。
ref顯示索引的哪一列被用來與?key?列指定的索引進行比較,以從表中選擇行。
rows?(非常重要)MySQL?估計為了找到所需的行而必須檢查的行數。這是一個估計值,通常越小越好。
filtered表示存儲引擎返回的數據在服務器層過濾后,剩余的行數占估計總行數的百分比。理想是 100%。
Extra?(非常重要)包含 MySQL 解決查詢的額外信息。這里經常會出現需要重點關注的內容,如是否使用了臨時表、文件排序等。

3. 關鍵列深度解析

1. type (訪問類型)

這是最重要的列之一。結果值從好到壞依次是:

  • system: 表只有一行(系統表)。這是?const?類型的特例。

  • const: 通過索引一次就能找到,用于比較?主鍵?或?唯一索引?的等值查詢。速度極快。

EXPLAIN SELECT * FROM users WHERE id = 1; -- id 是主鍵
  • eq_ref: 在連接查詢中,對于來自前表的每一行,從當前表中讀取唯一的一行。通常出現在使用?主鍵?或?唯一索引?的聯表查詢中。

-- 假設 orders.user_id 是 users.id 的外鍵,并且有索引
EXPLAIN SELECT * FROM users 
INNER JOIN orders ON users.id = orders.user_id;
  • ref: 使用非唯一性索引進行等值查找,或者使用索引的最左前綴規則進行查找。可能會返回多行。

EXPLAIN SELECT * FROM users WHERE age = 30; -- age 字段有一個普通索引
  • range: 使用索引檢索給定范圍的行,關鍵操作符是?BETWEEN,?>,?<,?IN?等。

EXPLAIN SELECT * FROM users WHERE age > 20 AND age < 30;
  • index:?全索引掃描。只遍歷索引樹來獲取數據,通常比?ALL?快,因為索引文件通常比數據文件小。

-- 假設 (age) 是一個索引
EXPLAIN SELECT age FROM users; -- 只需掃描索引,無需回表
  • ALL:?全表掃描。性能最差,意味著MySQL必須從頭到尾掃描整個表來找到匹配的行。如果數據量大,需要優化(如添加索引)。

目標:在查詢優化中,我們至少要讓?type?達到?range?級別,最好能達到?ref?或以上。

2. Extra (額外信息)

此列包含大量重要信息,常見值及其含義:

  • Using index: 表示查詢使用了?覆蓋索引(Covering Index),即所有需要的數據都可以從索引中獲取,無需回表讀取數據行。性能極佳

  • Using where: 表示存儲引擎返回行后,MySQL 服務器層還需要再進行過濾(WHERE 子句中的條件不能完全用索引來過濾)。

  • Using temporary: 表示 MySQL 需要創建一個臨時表來存儲結果以處理查詢。常見于?GROUP BY?和?ORDER BY?子句。通常需要優化

  • Using filesort: 表示 MySQL 無法使用索引來完成排序,需要額外的排序操作ORDER BY?、?GROUP BY?可能會引發此問題。在數據量大時性能很差,需要優化

  • Using join buffer (Block Nested Loop): 表示連接查詢時,被驅動表沒有使用索引,需要用到連接緩沖區。應考慮為被驅動表的連接字段添加索引

  • Impossible WHERE:?WHERE?子句的條件始終為 false,無法獲取任何行。

3. rows

MySQL 根據統計信息估算的需要讀取的行數。這個值乘以?filtered?百分比,可以估算出將要和下一張表連接的行數。這個值對于找出性能瓶頸非常有用,值越小越好

4. key

實際使用的索引。如果為?NULL,則說明沒有使用索引,需要檢查?possible_keys?為什么沒有被選用,或者考慮創建合適的索引。


4. 實戰分析示例

假設我們有兩張表:

users 表

  • id?(INT, PRIMARY KEY)

  • name?(VARCHAR(100))

  • age?(INT)

  • country?(VARCHAR(100))

  • 索引:?idx_age_country?(age,?country)

orders 表

  • order_id?(INT, PRIMARY KEY)

  • user_id?(INT)

  • amount?(DECIMAL)

  • 索引:?idx_user_id?(user_id)

查詢:?查找年齡在 25 到 35 歲之間、來自‘China’的用戶的所有訂單金額。

EXPLAIN 
SELECT o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id
WHERE u.age BETWEEN 25 AND 35
AND u.country = 'China';

可能的 EXPLAIN 輸出分析:

idselect_typetabletypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEurangeidx_age_countryidx_age_country208NULL10010.00Using where
1SIMPLEorefidx_user_ididx_user_id5test.u.id1100.00NULL

逐行解讀:

  1. 第一行 (users 表?u):

    • type: range: 很好!使用了索引范圍掃描來查找年齡在 25-35 之間的用戶。

    • key: idx_age_country: 實際使用了我們創建的復合索引。

    • key_len: 208: 索引使用的長度,可以推斷出?age?(INT 為 4 字節) 和?country?(VARCHAR(100), 假設 utf8mb4 字符集,最壞情況 100*4 + 長度前綴) 部分都被用到了。

    • rows: 100: MySQL 估計大約要掃描 100 行?users?表記錄。

    • Extra: Using where: 因為?country='China'?是索引的第二部分,它在索引范圍內進行查找(BETWEEN)后,可能還需要用這個條件進一步過濾數據。如果索引是?(country, age),效率可能會更高。

  2. 第二行 (orders 表?o):

    • type: ref: 很好!對于從?u?表找到的每一個?id,通過非唯一索引?idx_user_id?在?o?表中快速查找匹配的行。

    • key: idx_user_id: 實際使用了連接字段上的索引。

    • ref: test.u.id: 使用的是?u.id?的值來查找?o?表。

    • rows: 1: 對于每一個?u.id,MySQL 估計在?o?表中只找到 1 行記錄(這是一個很好的估計,假設一個用戶只有一個訂單)。

結論:這個查詢的執行計劃相當高效。兩張表都有效地使用了索引 (range?和?ref)。沒有出現?Using temporary?或?Using filesort?等危險信號。

5. 總結與最佳實踐

  1. 關注核心列:優先查看?type,?key,?rows,?Extra?列。

  2. 索引是王道:目標是讓?type?達到?range?級別以上,避免出現?ALL(全表掃描)。

  3. 警惕壞信號:在?Extra?列中,出現?Using temporary?和?Using filesort?通常是需要優化的信號,尤其是在大表查詢中。

  4. 覆蓋索引:努力讓?Extra?列出現?Using index,這能極大提升性能。

  5. 聯表查詢:確保連接條件(ON?子句)和被驅動表(第二張表)的?WHERE?子句上有索引。EXPLAIN?結果中,第一張表是驅動表。

  6. 不要迷信估計rows?列是基于統計信息的估計值,有時可能不準確。可以用?ANALYZE TABLE table_name;?來更新統計信息。

  7. 使用 JSON 格式:對于復雜查詢,使用?EXPLAIN FORMAT=JSON?可以獲取更詳盡的分析信息,包括成本估算。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/97287.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/97287.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/97287.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TensorFlow 面試題及詳細答案 120道(51-60)-- 模型保存、加載與部署

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面試題-專欄總目錄 文章目錄 一、本文面試題目錄 51. TensorFlow中保存和加…

從零開始學Shell編程:從基礎到實戰案例

從零開始學Shell編程&#xff1a;從基礎到實戰案例 文章目錄從零開始學Shell編程&#xff1a;從基礎到實戰案例一、認識Shell&#xff1a;是什么與為什么學1.1 Shell的定義1.2 常用Shell解釋器二、Shell編程快速入門&#xff1a;編寫第一個腳本2.1 步驟1&#xff1a;創建腳本文…

機器學習算法全景解析:從理論到實踐

機器學習算法全景解析&#xff1a;從理論到實踐引言機器學習作為人工智能的核心組成部分&#xff0c;正在深刻地改變我們的世界。從推薦系統到自動駕駛&#xff0c;從醫療診斷到金融風控&#xff0c;機器學習算法無處不在。本文將全面系統地介紹機器學習的主要算法類別及其核心…

week5-[二維數組]對角線

week5-[二維數組]對角線 題目描述 給定一個 nnn\times nnn 的正方形二維數組&#xff0c;輸出它兩條對角線上元素的和。 輸入格式 輸入共 n1n 1n1 行。 第 111 行 111 個正整數 nnn。 接下來 nnn 行&#xff0c;每行 nnn 個正整數 aija_{ij}aij? 表示這個二維數組。 輸出格式…

GoogLeNet:深度學習中的“卷積網絡變形金剛“

大家好&#xff01;今天我們要聊一個在深度學習領域掀起革命的經典網絡——GoogLeNet&#xff08;又稱Inception v1&#xff09;。這個由Google團隊在2014年提出的模型&#xff0c;不僅拿下了ImageNet競賽冠軍&#xff0c;更用"網絡中的網絡"設計理念徹底改變了卷積神…

筆記本電腦藍牙搜索不到設備-已解決

方法1打開疑難解答&#xff0c;選擇其他疑難解答&#xff0c;下劃選擇藍牙&#xff0c;點擊運行&#xff0c;電腦自行檢測并修復藍牙方法2右鍵此電腦&#xff0c;選擇管理&#xff0c;找到自己的藍牙設備。然后對箭頭指向的這個點擊右鍵&#xff0c;選擇《更新驅動程序》&#…

WPF 程序用戶權限模塊利用MarkupExtension實現控制控件顯示

工作記錄 ------------------------------------------------------------------------------------------------------- MarkupExtension:XAML標記擴展 實現了什么作用&#xff1a;通過擴展標記將一種輸入轉化為另一種類型的輸出 思路&#xff1a; 不直接設置控件的Visib…

SpringMVC相關梳理

SpringMVC 返回值類型&#xff08;一&#xff09;核心返回值類型分類視圖渲染類&#xff1a;用于跳轉并渲染頁面&#xff0c;如String&#xff08;指定視圖名&#xff09;、ModelAndView&#xff08;視圖 數據&#xff09;。數據返回類&#xff1a;用于返回數據&#xff08;而…

Docker化性能監控平臺搭建:JMeter+InfluxDB+Grafana全攻略

你作為一名DevOps工程師或測試專家&#xff0c;正在監控一個高并發微服務系統&#xff1a;突發流量峰值導致響應延遲&#xff0c;服務器CPU飆升&#xff0c;但你只能手動查看日志&#xff0c;優化起來像大海撈針。這時&#xff0c;DockerJMeterInfluxDBGrafana的“夢幻四重奏”…

Adobe Acrobat 中通過 JavaScript 調用 Web 服務

強大的JavaScript支持&#xff0c;允許用戶通過腳本自動化處理PDF文檔。本文將詳細介紹如何在Adobe Acrobat環境中使用JavaScript調用Web服務&#xff0c;包括基礎概念、實現方法、代碼示例以及常見問題解決方案。 第一部分&#xff1a;基礎概念與技術背景 1.1 Acrobat JavaScr…

SpringCloud OpenFeign 遠程調用(RPC)(三)

目錄 1 概念導入 2 添加依賴 3 在啟動類上添加注解 4 編寫對應的接口 5 注入并調用 6 日志 7 超時控制 8 超時重試 9 攔截器 10 Fallback兜底 1 概念導入 Spring Cloud OpenFeign Features :: Spring Cloud Openfeign 2 添加依賴 <!-- 遠程調用 --><depen…

【Flask】測試平臺開發,登陸重構

概述我們在開篇的時候實現了簡單的登陸功能&#xff0c;也實現了一個前后端聯調的登陸功能&#xff0c;但是你有沒有發現&#xff0c;那個登陸只是一個簡單的登陸&#xff0c;且密碼在接口返回的過程中是銘文密碼&#xff0c;在生產環境中使用肯定是不行的&#xff0c;一般密碼…

【Bluedroid】A2DP Source設備音頻數據讀取機制分析(btif_a2dp_source_read_callback)

本文聚焦Android 藍牙 A2DP Source設備的音頻數據讀取核心邏輯,深入解析關鍵回調函數btif_a2dp_source_read_callback的功能實現,包括從 HAL(硬件抽象層,支持 HIDL/AIDL 兩種傳輸方式)或 UIPC(用戶空間進程間通信)獲取音頻數據的路徑選擇機制,以及數據下溢(Underflow)…

多方調研賦能AI+智慧消防 豪越科技人工智能創新獲認可

8月26日&#xff0c;中國職業安全健康協會城市及社區安全發展專業委員會秘書長汪衛國以及常務副秘書長黃強亮等諸位領導到訪委員單位豪越科技&#xff0c;展開了實地的調研活動并給予相關指導。此次調研著重于了解豪越科技自主研發的“AI消防救援一體化安全管控平臺”&#xff…

算法---字符串

一、算法說明 字符串是一種類型&#xff0c;他不是一種算法&#xff0c;所以我們在處理這方面的問題的時候&#xff0c;需要結合其他的算法 二、題目 最長公共前綴 1、題目 最長公共前綴 2、解題思路 解法一&#xff1a;我們可以先讓兩個相互比較&#xff0c;然后在將比較…

鴻蒙Next導航與路由指南:組件導航與頁面路由的完美協作

一次搞懂HarmonyOS NEXT中的兩種導航方式&#xff0c;打造流暢的應用內跳轉體驗在鴻蒙應用開發中&#xff0c;流暢的頁面導航和路由是提升用戶體驗的關鍵。HarmonyOS NEXT提供了組件導航&#xff08;Navigation&#xff09; 和頁面路由&#xff08;ohos.router&#xff09; 兩種…

JavaScript原型詳解——面試重點

一、原型的含義&#xff1a;JavaScript 中的“原型”既指 函數身上的 prototype 對象&#xff0c;也指 對象身上的 [[Prototype]] 隱藏鏈接&#xff1b;它倆共同構成了“原型鏈”&#xff0c;決定了“找不到屬性時去哪里繼續找”的規則。&#xff08;1&#xff09;原型對象(pro…

Vue3 全面介紹

Vue3&#xff08;正式名稱為 Vue.js 3&#xff09;是 Vue.js 前端框架的第三個主要版本&#xff0c;于 2020 年 9 月正式發布。作為對 Vue2 的重大升級&#xff0c;Vue3 在核心架構、性能優化、開發體驗等方面進行了全面重構&#xff0c;同時保持了 Vue 一貫的“漸進式框架”理…

HTTP 范圍請求:為什么你的下載可以“斷點續傳”?

在現代網絡應用中&#xff0c;我們習以為常的功能&#xff0c;如斷點續傳、多線程下載和在線視頻快進快退&#xff0c;都依賴于 HTTP 協議中的一個強大特性&#xff1a;范圍請求&#xff08;Range Requests&#xff09;。這項技術讓客戶端能夠聰明地只請求文件的一部分&#xf…

萬博智云聯合華為云共建高度自動化的云容災基線解決方案

一、摘要 近日&#xff0c;萬博智云與華為云的深入合作再添新章——萬博智云HyperBDR云容災解決方案&#xff0c;順利通過華為云專家團隊評審和認證&#xff0c;正式被選為華為云基線解決方案&#xff08;Baseline Solution&#xff09;&#xff0c;并在華為云國際站上線。 Hy…