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

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

 更新時(shí)間:2026年03月16日 10:13:43   作者:愛(ài)吃鯊魚(yú)辣椒  
EXPLAIN是MySQL中用于分析SQL執(zhí)行計(jì)劃的核心命令,它能告訴你 MySQL優(yōu)化器會(huì)如何執(zhí)行這條SQL,本文就來(lái)想詳細(xì)的介紹了mysql中explain的具體實(shí)現(xiàn),感興趣的可以了解一下

一、MySQL EXPLAIN 是什么?

EXPLAIN 是 MySQL 中用于分析 SQL 執(zhí)行計(jì)劃的核心命令,它能告訴你 MySQL 優(yōu)化器會(huì)如何執(zhí)行這條 SQL(比如用什么索引、掃描多少行、連接方式等),是優(yōu)化慢 SQL 的必備工具。

可以把它理解為:你寫(xiě)了一條 SQL 想讓 MySQL 執(zhí)行,EXPLAIN 會(huì)提前告訴你 MySQL 的“執(zhí)行思路”—— 走哪條路、做哪些操作、效率怎么樣,幫你找到 SQL 里的性能瓶頸。

二、基本用法

1. 語(yǔ)法

EXPLAIN + 你的SQL語(yǔ)句;
-- 示例
EXPLAIN SELECT * FROM user WHERE id = 1;

如果想查看更詳細(xì)的執(zhí)行計(jì)劃(比如執(zhí)行時(shí)的成本、臨時(shí)表等),可以用:

EXPLAIN ANALYZE SELECT * FROM user WHERE id = 1; -- MySQL 8.0 及以上支持

2. 輸出字段說(shuō)明

執(zhí)行 EXPLAIN 后會(huì)返回一個(gè)結(jié)果集,核心字段如下(新手先掌握這 8 個(gè)核心字段即可):

字段核心含義
idSQL 執(zhí)行的順序(子查詢(xún)/聯(lián)表時(shí)會(huì)有多個(gè) id,數(shù)字越大越先執(zhí)行)
select_type查詢(xún)類(lèi)型(比如簡(jiǎn)單查詢(xún)、子查詢(xún)、聯(lián)表查詢(xún)、衍生表等)
table本次執(zhí)行涉及的表名
type訪(fǎng)問(wèn)類(lèi)型(核心!判斷性能的關(guān)鍵,從差到好:ALL < index < range < ref < eq_ref < const/system)
possible_keysMySQL 可能會(huì)選擇的索引(候選索引)
keyMySQL 實(shí)際使用的索引(如果為 NULL,說(shuō)明沒(méi)用到索引)
rowsMySQL 預(yù)估要掃描的行數(shù)(數(shù)值越小越好)
Extra額外信息(比如 Using index 走覆蓋索引、Using where 過(guò)濾條件、Using filesort 排序等)

三、核心字段詳解(新手重點(diǎn))

1. type(訪(fǎng)問(wèn)類(lèi)型)

這是 EXPLAIN 中最重要的字段,直接反映 SQL 的性能層級(jí),常見(jiàn)值從差到優(yōu)排序:

  • ALL:全表掃描(最差!會(huì)遍歷整個(gè)表),比如 SELECT * FROM user; 且無(wú)任何條件。
  • index:全索引掃描(比 ALL 好一點(diǎn),但仍?huà)呙枵麄€(gè)索引),比如查詢(xún)的字段都在索引里,但無(wú)過(guò)濾條件。
  • range:索引范圍掃描(比如用 >、<、BETWEEN、IN 等),比如 SELECT * FROM user WHERE id BETWEEN 1 AND 10;。
  • ref:非唯一索引掃描(匹配多行),比如 SELECT * FROM user WHERE name = '張三';(name 是普通索引)。
  • eq_ref:唯一索引掃描(匹配一行),比如聯(lián)表查詢(xún)時(shí)用主鍵/唯一索引關(guān)聯(lián),SELECT * FROM user u JOIN order o ON u.id = o.user_id;。
  • const/system:查詢(xún)結(jié)果能確定為一行(最優(yōu)),比如用主鍵查詢(xún) SELECT * FROM user WHERE id = 1;。

2. key(實(shí)際使用的索引)

  • 如果 key 為 NULL,說(shuō)明 MySQL 沒(méi)用到索引,大概率是 SQL 寫(xiě)得有問(wèn)題(比如用了函數(shù)操作索引字段、條件不匹配索引等)。
  • 示例:如果 user 表的 id 是主鍵(默認(rèn)索引),執(zhí)行 EXPLAIN SELECT * FROM user WHERE id = 1;,key 列會(huì)顯示 PRIMARY(主鍵索引名)。

3. Extra(關(guān)鍵提示)

  • Using index:走了“覆蓋索引”(查詢(xún)的字段都在索引里,無(wú)需回表查數(shù)據(jù)),性能極佳。

示例:user 表有索引 idx_name_age (name, age),執(zhí)行 EXPLAIN SELECT name, age FROM user WHERE name = '張三';,Extra 會(huì)顯示 Using index。

  • Using where:MySQL 會(huì)先掃描數(shù)據(jù),再用 WHERE 條件過(guò)濾(如果同時(shí)有 Using index,說(shuō)明先走索引再過(guò)濾)。
  • Using filesort:MySQL 需額外做排序(不是用索引排序),性能差,比如 SELECT * FROM user ORDER BY name; 但 name 無(wú)索引。
  • Using temporary:MySQL 需創(chuàng)建臨時(shí)表(比如 GROUP BY 沒(méi)用到索引),性能差,要優(yōu)化。

四、實(shí)戰(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(沒(méi)用到索引)
  • Extra:Using where(掃描后過(guò)濾)
  • 優(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:預(yù)估掃描行數(shù)(比如 10 行,遠(yuǎn)小于全表行數(shù))。

示例 3:覆蓋索引(優(yōu))

EXPLAIN SELECT name FROM user WHERE name = '張三';
  • type:ref
  • key:idx_name
  • Extra:Using index(覆蓋索引,無(wú)需回表)。

五、使用注意事項(xiàng)

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

總結(jié)

  1. EXPLAIN 是分析 SQL 執(zhí)行計(jì)劃的核心工具,重點(diǎn)看 type(訪(fǎng)問(wèn)類(lèi)型)、key(實(shí)際索引)、Extra(額外提示)三個(gè)字段。
  2. 優(yōu)化目標(biāo):盡量讓 type 達(dá)到 range 及以上,key 不為 NULL,避免 Extra 出現(xiàn) Using filesort/Using temporary。
  3. 最理想的執(zhí)行計(jì)劃:type 為 const/system + key 有值 + Extra 顯示 Using index。

到此這篇關(guān)于mysql中explain的具體實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)mysql explain內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

    完美解決MySQL通過(guò)localhost無(wú)法連接數(shù)據(jù)庫(kù)的問(wèn)題

    下面小編就為大家?guī)?lái)一篇完美解決MySQL通過(guò)localhost無(wú)法連接數(shù)據(jù)庫(kù)的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • windows下重啟mysql的方法

    windows下重啟mysql的方法

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

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

    undo?log是innodb引擎的一種日志,在事務(wù)的修改記錄之前,會(huì)把該記錄的原值先保存起來(lái)再做修改,以便修改過(guò)程中出錯(cuò)能夠恢復(fù)原值或者其他的事務(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?包管理器(適合新手)?和?手動(dòng)部署通用二進(jìn)制包(適合高級(jí)用戶(hù)),大家可以根據(jù)需要進(jìn)行選擇
    2025-11-11
  • MySQL的Data_ADD函數(shù)與日期格式化函數(shù)說(shuō)明

    MySQL的Data_ADD函數(shù)與日期格式化函數(shù)說(shuō)明

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

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

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

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

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

    MySQL的配置文件詳解及實(shí)例代碼

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

    MySQL Version確認(rèn)問(wèn)題(版本確認(rèn))

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

最新評(píng)論

南雄市| 彰化市| 辉南县| 屏山县| 辽宁省| 丰都县| 宜宾县| 信丰县| 鸡东县| 苗栗县| 米脂县| 天柱县| 上蔡县| 望城县| 孝义市| 雅安市| 孟津县| 邵武市| 天镇县| 屯昌县| 西峡县| 如皋市| 吴江市| 渝北区| 梅河口市| 黔西| 洛宁县| 宾川县| 阿拉善左旗| 贵州省| 景东| 文水县| 焦作市| 凭祥市| 时尚| 兴城市| 德化县| 武功县| 泰和县| 江永县| 昆明市|