日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL高级之explain详解

發(fā)布時間:2024/4/11 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL高级之explain详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

MySQL高級之explain詳解

文章目錄

  • MySQL高級之explain詳解
    • 一、expalin命令詳解
      • 1.使用方式
      • 2.結(jié)果顯示
      • 3.主要的字段信息
      • 4.作用
    • 二、id字段
    • 三、select_type字段
    • 四、table字段
    • 五、type字段
    • 六、possible_keys字段
    • 七、key字段
    • 八、key_len字段
    • 九、ref字段
    • 十、rows字段
    • 十一、Extra字段

在工作中,我們用于捕捉性能問題最常用的就是打開慢查詢,定位執(zhí)行效率差的SQL,那么 當(dāng)我們定位到一個SQL以后還不算完事,我們還需要知道該SQL的執(zhí)行計劃,比如是全表掃描,還是索引掃描,這些都需要通過EXPLAIN去完成。

EXPLAIN命令是查看優(yōu)化器如何決定執(zhí)行查詢的主要方法。

可以幫助我們深入了解MySQL的基于開銷的優(yōu)化器,還可以獲得很多可能被優(yōu)化器考慮到的訪問策略的細(xì)節(jié),以及當(dāng)運(yùn)行SQL語句時哪種策略預(yù)計會被優(yōu)化器采用。

一、expalin命令詳解

1.使用方式

explain + sql語句;

2.結(jié)果顯示

3.主要的字段信息

expain出來的信息有10列,分別是:

id、 select_type、 tabletype、possible_keys key、key_len、 ref、 rows、Extra
  • 概要描述:
  • id:選擇標(biāo)識符
  • select_type:表示查詢的類型。
  • table:輸出結(jié)果集的表
  • partitions:匹配的分區(qū)
  • type:表示表的連接類型
  • possible_keys:表示查詢時,可能使用的索引
  • key:表示實際使用的索引
  • key_len:索引字段的長度
  • ref:列與索引的比較
  • rows:掃描出的行數(shù)(估算的行數(shù))
  • filtered:按表條件過濾的行百分比
  • Extra:執(zhí)行情況的描述和說明

4.作用

  • 告訴你表的加載讀取順序
  • 告訴你sql語句有哪些索引可以被使用
  • 告訴你數(shù)據(jù)讀取的操作類型
  • 告訴你哪些索引是真正被使用的
  • 告訴你表與表之間的引用關(guān)系
  • 告訴你表中有多少行被物理查詢

二、id字段

  • id字段是select查詢的序列號,包含一組數(shù)字,表示查詢中執(zhí)行select子句或表的操作順序

id主要分3種情況:

  • id相同時,執(zhí)行順序由上至下

  • id不同, 如果是子查詢,id的序號會遞增,id值越大優(yōu)先級越高,越先被執(zhí)行

  • id如果相同也不同;id值越大,優(yōu)先級越高,越先執(zhí)行,id相同可以認(rèn)為是一組,從上往下順序執(zhí)行

  • 對應(yīng)于每個id來說,一個id就代表一個獨(dú)立的查詢,理論上是sql語句查詢數(shù)越少越好

三、select_type字段

  • 表示查詢中每個select子句的查詢類型,主要用來區(qū)分普通查詢、子查詢、聯(lián)合查詢的復(fù)雜查詢

  • (1) SIMPLE(簡單SELECT,不使用UNION或子查詢等)

  • (2) PRIMARY(子查詢中最外層查詢,查詢中若包含任何復(fù)雜的子部分,最外層的select被標(biāo)記為PRIMARY)

  • (3) UNION(第二個select出現(xiàn)在UNION之后)

  • (4) DEPENDENT UNION(UNION中的第二個或后面的SELECT語句,取決于外面的查詢)

  • (5) UNION RESULT(從UNION表獲取結(jié)果的select,union語句中第二個select開始后面所有select)

  • (6) SUBQUERY(select或where列表中包含的子查詢,子查詢中的第一個SELECT,結(jié)果不依賴于外部查詢)

  • (7) DEPENDENT SUBQUERY(子查詢中的第一個SELECT,依賴于外部查詢)

  • (8) DERIVED(在from列表中包含的子查詢,mysql會遞歸執(zhí)行這些子查詢,把結(jié)果放在臨時表內(nèi),)

  • (9) UNCACHEABLE SUBQUERY(一個子查詢的結(jié)果不能被緩存,必須重新評估外鏈接的第一行)

四、table字段

  • 顯示explain這一行的數(shù)據(jù)是屬于哪張表的,有時不是真實的表名字,可能是簡稱

五、type字段

  • 對表訪問方式,表示MySQL在表中找到所需行的方式,又稱“訪問類型”

  • 常用的類型有: ALL < index < range < ref < eq_ref < const < system < NULL(從左到右,性能從差到好)

  • ALL:Full Table Scan, MySQL將遍歷全表以找到匹配的行

  • index: Full Index Scan,index與ALL區(qū)別為index類型只遍歷索引樹找到匹配的行

  • range:只檢索給定范圍的行,使用一個索引來選擇行

這種范圍掃描索引比掃描全表好,因為它開始于索引的一點(diǎn),結(jié)束于索引的另一點(diǎn),相對于掃描全表要好

  • ref: 表示上述表的連接匹配條件,即哪些列或常量被用于查找索引列上的值

非唯一索引掃描,返回匹配某個值的所有行,本質(zhì)上也是一種索引訪問,它返回所有匹配某個單獨(dú)值的行,然而可能由多個行滿足條件,所以它屬于查找和掃描的混合體

  • eq_ref: 類似ref,區(qū)別就在使用的索引是唯一索引,對于每個索引鍵值,表中只有一條記錄匹配,簡單來說,就是多表連接中使用primary key或者 unique key作為關(guān)聯(lián)條件
唯一索引掃描,對于每個索引健,表中只有一條數(shù)據(jù)與之匹配,常見于主鍵和唯一健掃描
  • const、system: 當(dāng)MySQL對查詢某部分進(jìn)行優(yōu)化,并轉(zhuǎn)換為一個常量時,使用這些類型訪問。如將主鍵置于where列表中,MySQL就能將該查詢轉(zhuǎn)換為一個常量,system是const類型的特例,當(dāng)查詢的表只有一行的情況下,使用system

const表示通過索引一次就找到匹配的行了,用于比較primary key和union索引,因為只匹配一行數(shù)據(jù),所以很快,例如如果將主鍵放在where列表當(dāng)中,mysql就能將該查詢轉(zhuǎn)換為const

  • NULL: MySQL在優(yōu)化過程中分解語句,執(zhí)行時甚至不用訪問表或索引,例如從一個索引列里選取最小值可以通過單獨(dú)索引查找完成

一般而言,需要保證查詢至少達(dá)到range級別,能夠達(dá)到ref更好

六、possible_keys字段

  • 顯示可能使用在這個表上的索引,一個或多個,查詢的字段上若存在索引則會被該字段列出,但不一定被使用,該查詢可以利用的索引,如果沒有任何索引顯示 null

七、key字段

  • key列顯示MySQL實際決定使用的鍵(索引),如果為NULL,代表沒有使用任何索引
  • 注意覆蓋索引的特例,他不會出現(xiàn)在possible_keys列表當(dāng)中,只會出現(xiàn)在key中

如果沒有選擇索引,鍵是NULL,要想強(qiáng)制MySQL使用或忽視possible_keys列中的索引,在查詢中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

八、key_len字段

  • 表示索引中使用的字節(jié)數(shù),可通過該列計算查詢中使用的索引的長度(key_len顯示的值為索引字段的最大可能長度,并非實際使用長度,即key_len是根據(jù)表定義計算而得,不是通過表內(nèi)檢索出的)
  • 不損失精確性的情況下,長度越短越好

    通過key_len字段可以充分檢查是否成功使用到索引

九、ref字段

  • 列與索引的比較,表示上述表的連接匹配條件,即哪些列或常量被用于查找索引列上的值

十、rows字段

  • 估算出結(jié)果集行數(shù),表示MySQL根據(jù)表統(tǒng)計信息及索引選用情況,估算的找到所需的記錄所需要讀取的行數(shù),越少越好

十一、Extra字段

該列包含MySQL解決查詢的詳細(xì)信息,有以下幾種情況:

  • Using filesort:當(dāng)Query中包含 order by 操作,而且無法利用索引完成的排序操作稱為“文件排序”----九死一生
  • Using temporary:表示MySQL需要使用臨時表來存儲結(jié)果集,常見于排序和分組查詢,常見 group by ; order by-----十死無生

  • Using index:表示相應(yīng)的select語句中使用了索引,避免的掃描全表,效率不錯-----very good!!!
  • Using where:不用讀取表中所有信息,僅通過索引就可以獲取所需數(shù)據(jù),這發(fā)生在對表的全部的請求列都是同一個索引的部分的時候,表示mysql服務(wù)器將在存儲引擎檢索行后再進(jìn)行過濾
  • Using join buffer:改值強(qiáng)調(diào)了在獲取連接條件時沒有使用索引,并且需要連接緩沖區(qū)來存儲中間結(jié)果。如果出現(xiàn)了這個值,那應(yīng)該注意,根據(jù)查詢的具體情況可能需要添加索引來改進(jìn)能。
  • Impossible where:這個值強(qiáng)調(diào)了where語句會導(dǎo)致沒有符合條件的行(通過收集統(tǒng)計信息不可能存在結(jié)果)。
  • Select tables optimized away:這個值意味著僅通過使用索引,優(yōu)化器可能僅從聚合函數(shù)結(jié)果中返回一行
  • No tables used:Query語句中使用from dual 或不含任何from子句

總結(jié)

以上是生活随笔為你收集整理的MySQL高级之explain详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。