深入了解 MySQL 的 EXPLAIN 命令

一、什么是 EXPLAIN 命令?

EXPLAIN 命令用于顯示 MySQL 如何執行某個 SQL 語句,尤其是 SELECT 語句。通過 EXPLAIN 命令,可以看到查詢在實際執行前的執行計劃,這對于優化查詢性能至關重要。

二、EXPLAIN 的基本用法

要使用 EXPLAIN 命令,只需在你的 SELECT 語句前加上 EXPLAIN 關鍵字即可。例如:

EXPLAIN SELECT * FROM employees WHERE department = 'Sales';

執行上述命令后,MySQL 會返回一個結果集,包含關于查詢執行計劃的詳細信息。下面我們逐一解釋這些信息。

三、EXPLAIN 結果各列的含義

EXPLAIN 命令的結果集通常包含以下幾列:

  • id
  • select_type
  • table
  • partitions
  • type
  • possible_keys
  • key
  • key_len
  • ref
  • rows
  • filtered
  • Extra

id

id 列表示查詢中每個 SELECT 子句的標識符。單個查詢的 id 值通常是 1,子查詢和聯合查詢的 id 值可能不同。

select_type

select_type 列表示 SELECT 的類型,常見的值有:

  • SIMPLE:簡單的 SELECT 查詢,不包含子查詢或聯合查詢。
  • PRIMARY:最外層的 SELECT 查詢。
  • UNION:UNION 中的第二個或后續的 SELECT 查詢。
  • DEPENDENT UNION:UNION 中的第二個或后續的 SELECT 查詢,依賴于外部查詢。
  • UNION RESULT:UNION 的結果。
  • SUBQUERY:子查詢中的第一個 SELECT。
  • DEPENDENT SUBQUERY:子查詢中的第一個 SELECT,依賴于外部查詢。
  • DERIVED:派生表(子查詢的 FROM 子句)。

table

table 列表示正在訪問的表的名稱。

partitions

partitions 列表示查詢涉及到的分區。如果表是分區表,此列將顯示實際訪問的分區。如果沒有使用分區,該列顯示 NULL

type(重點)

type 列表示連接類型(join type),反映了 MySQL 在執行查詢時使用的訪問方法。連接類型從最優到最差依次如下:

  • system:表僅有一行(等于系統表),這是 const 類型的特例。
  • const:表最多有一個匹配行,這是非常快速的,因為匹配行在優化階段就讀取出來了。使用索引一般是一般是 唯一索引 或 主鍵索引。
  • eq_ref:對于每個來自前一張表的行組合,讀一行,這是最理想的連接類型。連接字段,使用索引一般是 唯一索引 或 主鍵索引。
  • ref:對于每個來自前一張表的行組合,讀出所有匹配某個單獨值的行。使用索引一般是普通索引。
  • range:檢索給定范圍內的行,使用一個索引來選擇行。
  • index:全索引掃描(與全表掃描類似,但遍歷索引樹)。
  • ALL:全表掃描。

possible_keys

possible_keys 列表示查詢可能使用的索引。

key(重點)

key 列表示實際使用的索引。如果沒有選擇索引,顯示 NULL

key_len

key_len 列表示使用的索引鍵的長度。這個值是 MySQL 決定使用哪個索引時考慮的。

ref

ref 列表示使用哪個列或常量與 key 一起從表中選擇行。

rows

rows 列表示 MySQL 估計為了找到所需的行,需要讀取的行數。

filtered

filtered 列表示經過表條件過濾后返回的行數百分比。這個值表示剩余行數相對于讀取的行數的百分比。計算公式為:filtered = (滿足表條件的記錄數 / 該表的總記錄數) * 100%。

注意如果使用索引查詢,那么 MySQL 可能不會掃全表,直接查出索引中返回的數據,filtered 會是 100。

Extra

Extra 列包含關于查詢的詳細信息,可能的值有:

  • Using index:只使用索引信息而不讀取實際的行(覆蓋索引)。
  • Using where:使用 WHERE 子句來限制哪些行將與下一張表匹配或返回給用戶。
  • Using temporary:需要使用臨時表來存儲結果。
  • Using filesort:需要額外的傳遞來排序結果。

四、EXPLAIN 命令 type 字段 SQL 測試

4.1、const 類型測試

-- const 類型測試
drop table if exists user;
create table user (id int primary key,name varchar(20)
)engine=innodb;insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');explain
select *
from user
where id = 1;

image-20240713155353388

4.2、eq_ref 類型測試

-- eq_ref 類型測試
drop table if exists user_balance;
drop table if exists user;create table user (id int primary key,name varchar(20)
)engine=innodb;insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');create table user_balance (uid int primary key,balance int
)engine=innodb;insert into user_balance values(1,100);
insert into user_balance values(2,200);
insert into user_balance values(3,300);
insert into user_balance values(4,400);explain
select *
from userleft join user_balance on user.id = user_balance.uid
where user.id = user_balance.uid;

image-20240713155429390

4.3、ref 類型測試

-- ref 類型測試
drop table if exists user_balance;
drop table if exists user;create table user (id int primary key,name varchar(20)
)engine=innodb;insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');create table user_balance (uid int,balance int,index(uid)
)engine=innodb;insert into user_balance values(1,100);
insert into user_balance values(2,200);
insert into user_balance values(3,300);
insert into user_balance values(4,400);
insert into user_balance values(5,500);explain
select *
from userleft join user_balance on user.id = user_balance.uid
where user.id = 1;explain select * from user_balance where uid = 1;

image-20240713155508580

4.4、range 類型測試

-- range 類型測試
drop table if exists user;create table user (id int primary key,name varchar(20)
)engine=innodb;insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');explain
select *
from user
where id between 1 and 2;explain
select *
from user
where id in (1, 2, 3);explain
select *
from user
where id > 1;

image-20240713155627248

4.5、index 類型測試

-- index 類型測試
drop table if exists user;create table user (id int primary key,name varchar(20)
)engine=innodb;insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');explain
select count(1)
from user;

image-20240713155701062

4.6、ALL 類型測試

-- ALL 類型測試
drop table if exists user;create table user (id int,name varchar(20)
)engine=innodb;insert into user values(1,'ar414');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');
insert into user values(5,'zhaoliu');explain
select *
from user
where id = 1;

image-20240713155750163

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

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

相關文章

如何禁用鍵盤上的特定鍵或快捷方式?這里有詳細步驟

要禁用特定的鍵盤鍵或快捷鍵嗎?微軟官方應用程序Microsoft PowerToys使這項任務變得非常簡單。以下是使用Microsoft PowerToys中的鍵盤管理器禁用特定鍵或快捷方式的快速指南。 如果你還沒有安裝Microsoft PowerToys 如果你的設備上沒有安裝Microsoft PowerToys&a…

springboot上傳圖片

前端的name的值必須要和后端的MultipartFile 形參名一致 存儲本地

3.2、matlab單目相機標定原理、流程及實驗

1、單目相機標定流程及步驟 單目相機標定是通過確定相機的內部和外部參數,以便準確地在圖像空間和物體空間之間建立映射關系。下面是單目相機標定的流程及步驟: 搜集標定圖像:使用不同角度、距離和姿態拍攝一組標定圖像,并確保標定板(可以是棋盤格或者圓形標定板)完整可…

鴻蒙開發:Universal Keystore Kit(密鑰管理服務)【匿名密鑰證明(C/C++)】

匿名密鑰證明(C/C) 在使用本功能時,需確保網絡通暢。 在CMake腳本中鏈接相關動態庫 target_link_libraries(entry PUBLIC libhuks_ndk.z.so)開發步驟 確定密鑰別名keyAlias,密鑰別名最大長度為64字節;初始化參數集:通過[OH_Huk…

AcWing 667. 游戲時間

讀取兩個整數 A𝐴 和 B𝐵,表示游戲的開始時間和結束時間,以小時為單位。 然后請你計算游戲的持續時間,已知游戲可以在一天開始并在另一天結束,最長持續時間為 2424 小時。 如果 A𝐴 與 B&…

css3 transform的旋轉和位移制作太陽花

css3 transform 實例展示知識點rotate 旋轉translate 位移transform: translate(300px,200px) rotate(90deg) 實例代碼 實例展示 知識點 transform的兩個屬性 rotate 旋轉 translate 位移 transform: translate(300px,200px) rotate(90deg) 實例代碼 <!DOCTYPE html&g…

flask 定時任務(APScheduler)使用current_app app_context()上下文

前言: 描述&#xff1a;flask定時任務調用的方法中使用了current_app.logger.info()記錄日志報錯 報錯代碼 raise RuntimeError(unbound_message) from None RuntimeError: Working outside of application context.This typically means that you attempted to use functiona…

IDEA中Git常用操作及Git存儲原理

Git簡介與使用 Intro Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. Git是一款分布式版本控制系統&#xff08;VSC&#xff09;&#xff0c;是團隊合作開發…

算法學習筆記(8.3)-(0-1背包問題)

目錄 最常見的0-1背包問題&#xff1a; 第一步&#xff1a;思考每輪的決策&#xff0c;定義狀態&#xff0c;從而得到dp表 第二步&#xff1a;找出最優子結構&#xff0c;進而推導出狀態轉移方程 第三步&#xff1a;確定邊界條件和狀態轉移順序 方法一&#xff1a;暴力搜素…

KBS(Knowledge-Based Systems)期刊投稿記錄

記錄一些關鍵時間節點 2023.12.31 投稿 2024.01.30 返回審稿意見 2024.05.20 提交r1 2024.05.31 返回審稿意見(conditional accept)包括語言潤色 2024.06.09 提交r2&#xff0c;沒有使用愛思維爾的潤色 2024.06.10 with editor 2024.06.13 under review 2024.06.24 revise(折磨…

MFC之對話框--線寬/線型/顏色

文章目錄 線寬輸入實現優化無法記錄上一次線粗問題 線寬滑動實現實現選擇線類型實現顏色選擇總結 線寬輸入實現 優化無法記錄上一次線粗問題 線寬滑動實現 實現選擇線類型 實現顏色選擇 總結 1。創建新窗口&#xff08;dialog)會創建一個新的類&#xff0c;在類中實現窗口中的…

vue中父子傳遞屬性值

1、父傳子屬性值 自定義圖庫組件 在add.vue中應用tuku組件并給默認值 效果 2、 子傳父&#xff0c;逆向賦值 add.vue和第一問中一樣 修改tuku組件&#xff0c;傳值給add.vue 3、多個傳遞 效果&#xff1a; 點擊兩個修改按鈕后 4、使用defineModel簡化父子傳值 其他代碼跟…

【postgresql】時間函數和操作符

日期/時間操作符 加減操作符&#xff1a; 和 - 可以用于日期、時間、時間戳和時間間隔的加減操作。 SELECT 2024-01-01::date INTERVAL 1 day as "date"; ; -- 結果&#xff1a;2024-01-02SELECT 2024-01-01 12:00:00::timestamp - INTERVAL 2 hours as "…

概率論原理精解【2】

文章目錄 笛卡爾積任意笛卡爾積投影映射概述詳解一一、定義二、性質三、應用四、結論 詳解二定義與性質應用與意義示例結論 參考文獻 笛卡爾積 任意笛卡爾積 { A t , t ∈ T } \{A_t,t \in T\} {At?,t∈T}是一個集合族&#xff0c;其中T為一個非空指標集&#xff0c;稱 t ∈…

CSS上下懸浮特效

要實現一個上下懸浮的特效&#xff0c;可以使用CSS的keyframes規則和動畫屬性。以下是一個簡單的示例&#xff1a; 代碼示例 /* 定義一個名為floating的動畫 */ keyframes floating {0% {transform: translateY(0); /* 初始位置 */}50% {transform: translateY(-4px); /* 向上…

M1000 4G藍牙網關:高速穩定,賦能物聯網新體驗

桂花網M1000的4G移動網絡功能主要體現在以下幾個方面&#xff1a; 一、高速穩定的數據傳輸 高速率&#xff1a;M1000支持4G移動網絡&#xff0c;能夠實現高速的數據傳輸。根據4G網絡的技術標準&#xff0c;其理論上的最大下行速率可達到數百Mbps&#xff08;如TD-LTE在20MHz帶…

KALI使用MSF攻擊安卓設備

這期是kali使用MSF進行安卓滲透的保姆級別教程&#xff0c;話不多說&#xff0c;直接開始。 準備材料&#xff1a; 1.裝有kali的實體機或虛擬機&#xff08;這里用實體機進行演示&#xff09; 2.一臺安卓10.0以下的手機 打開kali&#xff0c;先用ifconfig查看自己的kali IP地址…

Python3極簡教程(一小時學完)下

目錄 PEP8 代碼風格指南 知識點 介紹 愚蠢的一致性就像沒腦子的妖怪 代碼排版 縮進 制表符還是空格 每行最大長度 空行 源文件編碼 導入包 字符串引號 表達式和語句中的空格 不能忍受的情況 其他建議 注釋 塊注釋 行內注釋 文檔字符串 版本注記 命名約定 …

[BJDCTF2020]EasySearch1

知識點&#xff1a; 1.swp泄露 2.md5碰撞 3.PHP代碼審計 4.SSI代碼執行漏洞 // Apache SSI 遠程命令執行漏洞復現 看著像sql注入&#xff0c;不過注入無果&#xff0c;掃一下目錄試試~ 發現是swp泄露. SWP文件泄露漏洞是指在使用 Vim編輯器 編輯一個文件時&#xff0c;Vim會在…

codeforce 954 div3 G2題

思路&#xff1a; 質因子分解可以順著分解&#xff0c;也可以逆著分解 即找到每一個數字的倍數&#xff0c;再找到每一個數字的因數 const int N 5e510; vector<int> ff[N]; vector<int> f[N]; vector<int> g[N];void solve(){int n;cin>>n;vector&l…