mysql中explain的具體實現(xiàn)
一、MySQL EXPLAIN 是什么?
EXPLAIN 是 MySQL 中用于分析 SQL 執(zhí)行計劃的核心命令,它能告訴你 MySQL 優(yōu)化器會如何執(zhí)行這條 SQL(比如用什么索引、掃描多少行、連接方式等),是優(yōu)化慢 SQL 的必備工具。
可以把它理解為:你寫了一條 SQL 想讓 MySQL 執(zhí)行,EXPLAIN 會提前告訴你 MySQL 的“執(zhí)行思路”—— 走哪條路、做哪些操作、效率怎么樣,幫你找到 SQL 里的性能瓶頸。
二、基本用法
1. 語法
EXPLAIN + 你的SQL語句; -- 示例 EXPLAIN SELECT * FROM user WHERE id = 1;
如果想查看更詳細的執(zhí)行計劃(比如執(zhí)行時的成本、臨時表等),可以用:
EXPLAIN ANALYZE SELECT * FROM user WHERE id = 1; -- MySQL 8.0 及以上支持
2. 輸出字段說明
執(zhí)行 EXPLAIN 后會返回一個結(jié)果集,核心字段如下(新手先掌握這 8 個核心字段即可):
| 字段 | 核心含義 |
|---|---|
| id | SQL 執(zhí)行的順序(子查詢/聯(lián)表時會有多個 id,數(shù)字越大越先執(zhí)行) |
| select_type | 查詢類型(比如簡單查詢、子查詢、聯(lián)表查詢、衍生表等) |
| table | 本次執(zhí)行涉及的表名 |
| type | 訪問類型(核心!判斷性能的關(guān)鍵,從差到好:ALL < index < range < ref < eq_ref < const/system) |
| possible_keys | MySQL 可能會選擇的索引(候選索引) |
| key | MySQL 實際使用的索引(如果為 NULL,說明沒用到索引) |
| rows | MySQL 預估要掃描的行數(shù)(數(shù)值越小越好) |
| Extra | 額外信息(比如 Using index 走覆蓋索引、Using where 過濾條件、Using filesort 排序等) |
三、核心字段詳解(新手重點)
1. type(訪問類型)
這是 EXPLAIN 中最重要的字段,直接反映 SQL 的性能層級,常見值從差到優(yōu)排序:
- ALL:全表掃描(最差!會遍歷整個表),比如 SELECT * FROM user; 且無任何條件。
- index:全索引掃描(比 ALL 好一點,但仍掃描整個索引),比如查詢的字段都在索引里,但無過濾條件。
- range:索引范圍掃描(比如用 >、<、BETWEEN、IN 等),比如 SELECT * FROM user WHERE id BETWEEN 1 AND 10;。
- ref:非唯一索引掃描(匹配多行),比如 SELECT * FROM user WHERE name = '張三';(name 是普通索引)。
- eq_ref:唯一索引掃描(匹配一行),比如聯(lián)表查詢時用主鍵/唯一索引關(guān)聯(lián),SELECT * FROM user u JOIN order o ON u.id = o.user_id;。
- const/system:查詢結(jié)果能確定為一行(最優(yōu)),比如用主鍵查詢 SELECT * FROM user WHERE id = 1;。
2. key(實際使用的索引)
- 如果 key 為 NULL,說明 MySQL 沒用到索引,大概率是 SQL 寫得有問題(比如用了函數(shù)操作索引字段、條件不匹配索引等)。
- 示例:如果 user 表的 id 是主鍵(默認索引),執(zhí)行 EXPLAIN SELECT * FROM user WHERE id = 1;,key 列會顯示 PRIMARY(主鍵索引名)。
3. Extra(關(guān)鍵提示)
- Using index:走了“覆蓋索引”(查詢的字段都在索引里,無需回表查數(shù)據(jù)),性能極佳。
示例:user 表有索引 idx_name_age (name, age),執(zhí)行 EXPLAIN SELECT name, age FROM user WHERE name = '張三';,Extra 會顯示 Using index。
- Using where:MySQL 會先掃描數(shù)據(jù),再用 WHERE 條件過濾(如果同時有 Using index,說明先走索引再過濾)。
- Using filesort:MySQL 需額外做排序(不是用索引排序),性能差,比如 SELECT * FROM user ORDER BY name; 但 name 無索引。
- Using temporary:MySQL 需創(chuàng)建臨時表(比如 GROUP BY 沒用到索引),性能差,要優(yōu)化。
四、實戰(zhàn)示例
假設(shè)有一張 user 表,結(jié)構(gòu)如下:
CREATE TABLE `user` ( `id` int PRIMARY KEY AUTO_INCREMENT, `name` varchar(20) NOT NULL, `age` int, `gender` tinyint, INDEX `idx_name` (`name`) -- 普通索引 );
示例 1:全表掃描(差)
EXPLAIN SELECT * FROM user WHERE age = 20;
- type:ALL(全表掃描)
- key:NULL(沒用到索引)
- Extra:Using where(掃描后過濾)
- 優(yōu)化:給 age 加索引 ALTER TABLE user ADD INDEX idx_age (age);。
示例 2:使用索引(好)
EXPLAIN SELECT * FROM user WHERE name = '張三';
- type:ref(非唯一索引掃描)
- key:idx_name(用到了 name 的索引)
- rows:預估掃描行數(shù)(比如 10 行,遠小于全表行數(shù))。
示例 3:覆蓋索引(優(yōu))
EXPLAIN SELECT name FROM user WHERE name = '張三';
- type:ref
- key:idx_name
- Extra:Using index(覆蓋索引,無需回表)。
五、使用注意事項
- EXPLAIN 的 rows 是 MySQL 預估的掃描行數(shù),不是實際行數(shù),但能反映性能趨勢(數(shù)值越小越好)。
- EXPLAIN 只分析執(zhí)行計劃,不會實際執(zhí)行 SQL(除非用 EXPLAIN ANALYZE),所以可以放心在生產(chǎn)環(huán)境使用。
- 即使 possible_keys 有值,key 也可能為 NULL —— 說明 MySQL 認為走索引不如全表掃描快(比如表數(shù)據(jù)量極?。?/li>
總結(jié)
- EXPLAIN 是分析 SQL 執(zhí)行計劃的核心工具,重點看 type(訪問類型)、key(實際索引)、Extra(額外提示)三個字段。
- 優(yōu)化目標:盡量讓 type 達到 range 及以上,key 不為 NULL,避免 Extra 出現(xiàn) Using filesort/Using temporary。
- 最理想的執(zhí)行計劃:type 為 const/system + key 有值 + Extra 顯示 Using index。
到此這篇關(guān)于mysql中explain的具體實現(xiàn)的文章就介紹到這了,更多相關(guān)mysql explain內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
php中關(guān)于mysqli和mysql區(qū)別的一些知識點分析
看書、看視頻的時候一直沒有搞懂mysqli和mysql到底有什么區(qū)別。于是今晚“谷歌”一番,整理一下。需要的朋友可以參考下。2011-08-08
完美解決MySQL通過localhost無法連接數(shù)據(jù)庫的問題
下面小編就為大家?guī)硪黄昝澜鉀QMySQL通過localhost無法連接數(shù)據(jù)庫的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02
CentOS?7/8/9上安裝?MySQL?8.0+的方法完整指南
本文提供兩種在?CentOS?7/8/9?系統(tǒng)上安裝?MySQL?8.0?或更高版本的官方推薦方法,即使用?Yum?包管理器(適合新手)?和?手動部署通用二進制包(適合高級用戶),大家可以根據(jù)需要進行選擇2025-11-11
MySQL的Data_ADD函數(shù)與日期格式化函數(shù)說明
今天看到了MySQL的日期函數(shù),里面很多有用的,這里只把兩個參數(shù)不太好記的粘下來了。2010-06-06
mysql創(chuàng)建本地用戶及賦予數(shù)據(jù)庫權(quán)限的方法示例
這篇文章主要介紹了mysql創(chuàng)建本地用戶及賦予數(shù)據(jù)庫權(quán)限的相關(guān)資料,文中的介紹的非常詳細,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-04-04

