最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql中explain的具體實現(xiàn)

 更新時間:2026年03月16日 10:13:43   作者:愛吃鯊魚辣椒  
EXPLAIN是MySQL中用于分析SQL執(zhí)行計劃的核心命令,它能告訴你 MySQL優(yōu)化器會如何執(zhí)行這條SQL,本文就來想詳細的介紹了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 個核心字段即可):

字段核心含義
idSQL 執(zhí)行的順序(子查詢/聯(lián)表時會有多個 id,數(shù)字越大越先執(zhí)行)
select_type查詢類型(比如簡單查詢、子查詢、聯(lián)表查詢、衍生表等)
table本次執(zhí)行涉及的表名
type訪問類型(核心!判斷性能的關(guān)鍵,從差到好:ALL < index < range < ref < eq_ref < const/system)
possible_keysMySQL 可能會選擇的索引(候選索引)
keyMySQL 實際使用的索引(如果為 NULL,說明沒用到索引)
rowsMySQL 預估要掃描的行數(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(覆蓋索引,無需回表)。

五、使用注意事項

  1. EXPLAIN 的 rows 是 MySQL 預估的掃描行數(shù),不是實際行數(shù),但能反映性能趨勢(數(shù)值越小越好)。
  2. EXPLAIN 只分析執(zhí)行計劃,不會實際執(zhí)行 SQL(除非用 EXPLAIN ANALYZE),所以可以放心在生產(chǎn)環(huán)境使用。
  3. 即使 possible_keys 有值,key 也可能為 NULL —— 說明 MySQL 認為走索引不如全表掃描快(比如表數(shù)據(jù)量極?。?/li>

總結(jié)

  1. EXPLAIN 是分析 SQL 執(zhí)行計劃的核心工具,重點看 type(訪問類型)、key(實際索引)、Extra(額外提示)三個字段。
  2. 優(yōu)化目標:盡量讓 type 達到 range 及以上,key 不為 NULL,避免 Extra 出現(xiàn) Using filesort/Using temporary。
  3. 最理想的執(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ū)別的一些知識點分析

    php中關(guān)于mysqli和mysql區(qū)別的一些知識點分析

    看書、看視頻的時候一直沒有搞懂mysqli和mysql到底有什么區(qū)別。于是今晚“谷歌”一番,整理一下。需要的朋友可以參考下。
    2011-08-08
  • 完美解決MySQL通過localhost無法連接數(shù)據(jù)庫的問題

    完美解決MySQL通過localhost無法連接數(shù)據(jù)庫的問題

    下面小編就為大家?guī)硪黄昝澜鉀QMySQL通過localhost無法連接數(shù)據(jù)庫的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • windows下重啟mysql的方法

    windows下重啟mysql的方法

    這篇文章主要介紹了windows下重啟mysql的方法,需要的朋友可以參考下
    2014-12-12
  • MySQL回滾日志(undo?log)的作用和使用詳解

    MySQL回滾日志(undo?log)的作用和使用詳解

    undo?log是innodb引擎的一種日志,在事務(wù)的修改記錄之前,會把該記錄的原值先保存起來再做修改,以便修改過程中出錯能夠恢復原值或者其他的事務(wù)讀取,這篇文章主要給大家介紹了關(guān)于MySQL回滾日志(undo?log)的作用和使用的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • CentOS?7/8/9上安裝?MySQL?8.0+的方法完整指南

    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的Data_ADD函數(shù)與日期格式化函數(shù)說明

    今天看到了MySQL的日期函數(shù),里面很多有用的,這里只把兩個參數(shù)不太好記的粘下來了。
    2010-06-06
  • mysql創(chuàng)建本地用戶及賦予數(shù)據(jù)庫權(quán)限的方法示例

    mysql創(chuàng)建本地用戶及賦予數(shù)據(jù)庫權(quán)限的方法示例

    這篇文章主要介紹了mysql創(chuàng)建本地用戶及賦予數(shù)據(jù)庫權(quán)限的相關(guān)資料,文中的介紹的非常詳細,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-04-04
  • 101個MySQL優(yōu)化技巧和提示

    101個MySQL優(yōu)化技巧和提示

    人們一直在推動MySQL發(fā)展到它的極限。這里是101條調(diào)節(jié)和優(yōu)化MySQL安裝的技巧。一些技巧是針對特定的安裝環(huán)境的,但這些思路是通用的。我已經(jīng)把他們分成幾類,來幫助你掌握更多MySQL的調(diào)節(jié)和優(yōu)化技巧。
    2014-02-02
  • MySQL的配置文件詳解及實例代碼

    MySQL的配置文件詳解及實例代碼

    MySQL的配置文件是服務(wù)器運行的重要組成部分,用于設(shè)置服務(wù)器操作的各種參數(shù),下面這篇文章主要介紹了MySQL配置文件的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-08-08
  • MySQL Version確認問題(版本確認)

    MySQL Version確認問題(版本確認)

    這篇文章主要介紹了MySQL Version確認問題(版本確認),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評論

台前县| 沾化县| 海兴县| 潞西市| 瓦房店市| 平果县| 宜城市| 博爱县| 许昌县| 山阳县| 芷江| 周至县| 高陵县| 延寿县| 磐石市| 布尔津县| 商洛市| 黎城县| 钟山县| 共和县| 望城县| 岑巩县| 青冈县| 广东省| 乡宁县| 民县| 易门县| 兖州市| 叶城县| 吉林市| 黑山县| 上虞市| 湖口县| 阳西县| 玉林市| 建水县| 米脂县| 金川县| 保靖县| 连江县| 兖州市|