久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

mysql中的explain怎么使用

134次閱讀
沒有評論

共計 3762 個字符,預計需要花費 10 分鐘才能閱讀完成。

本篇內容介紹了“mysql 中的 explain 怎么使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

在 mysql 中,explain 命令主要用于查看 SQL 語句的執行計劃,該命令可以模擬優化器執行 SQL 查詢語句,從而知道 mysql 是如何處理用戶的 SQL 語句,語法為“explain SQL 語句;”。

本教程操作環境:windows10 系統、mysql8.0.22 版本、Dell G3 電腦。

mysql 中 explain 的用法是什么

explain 命令主要來查看 SQL 語句的執行計劃,查看該 SQL 語句有沒有使用索引,有沒有做全表掃描等。它可以模擬優化器執行 SQL 查詢語句,從而知道 MySQL 是如何處理用戶的 SQL 語句。

在日常工作中,我們會有時會開慢查詢去記錄一些執行時間比較久的 SQL 語句,找出這些 SQL 語句并不意味著完事了,些時我們常常用到 explain 這個命令來查看一個這些 SQL 語句的執行計劃,查看該 SQL 語句有沒有使用上了索引,有沒有做全表掃描,這都可以通過 explain 命令來查看。所以我們深入了解 MySQL 的基于開銷的優化器,還可以獲得很多可能被優化器考慮到的訪問策略的細節,以及當運行 SQL 語句時哪種策略預計會被優化器采用。

--  實際 SQL,查找用戶名為 Jefabc 的員工
select * from emp where name =  Jefabc 
--  查看 SQL 是否使用索引,前面加上 explain 即可
explain select * from emp where name =  Jefabc

expain 出來的信息有 10 列,分別是 id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra

概要描述:

id: 選擇標識符

select_type: 表示查詢的類型。

table: 輸出結果集的表

partitions: 匹配的分區

type: 表示表的連接類型

possible_keys: 表示查詢時,可能使用的索引

key: 表示實際使用的索引

key_len: 索引字段的長度

ref: 列與索引的比較

rows: 掃描出的行數 (估算的行數)

filtered: 按表條件過濾的行百分比

Extra: 執行情況的描述和說明

下面對這些字段出現的可能進行解釋:

一、id

SELECT 識別符。這是 SELECT 的查詢序列號

我的理解是 SQL 執行的順序的標識,SQL 從大到小的執行

1. id 相同時,執行順序由上至下

2. 如果是子查詢,id 的序號會遞增,id 值越大優先級越高,越先被執行

3. id 如果相同,可以認為是一組,從上往下順序執行;在所有組中,id 值越大,優先級越高,越先執行

--  查看在研發部并且名字以 Jef 開頭的員工,經典查詢
explain select e.no, e.name from emp e left join dept d on e.dept_no = d.no where e.name like  Jef%  and d.name =  研發部 

二、select_type

示查詢中每個 select 子句的類型

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

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

(3) UNION(UNION 中的第二個或后面的 SELECT 語句)

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

(5) UNION RESULT(UNION 的結果,union 語句中第二個 select 開始后面所有 select)

(6) SUBQUERY(子查詢中的第一個 SELECT,結果不依賴于外部查詢)

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

(8) DERIVED(派生表的 SELECT, FROM 子句的子查詢)

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

三、table

顯示這一步所訪問數據庫中表名稱(顯示這一行的數據是關于哪張表的),有時不是真實的表名字,可能是簡稱,例如上面的 e,d,也可能是第幾步執行的結果的簡稱

四、type

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

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

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

index: Full Index Scan,index 與 ALL 區別為 index 類型只遍歷索引樹

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

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

eq_ref: 類似 ref,區別就在使用的索引是唯一索引,對于每個索引鍵值,表中只有一條記錄匹配,簡單來說,就是多表連接中使用 primary key 或者 unique key 作為關聯條件

const、system: 當 MySQL 對查詢某部分進行優化,并轉換為一個常量時,使用這些類型訪問。如將主鍵置于 where 列表中,MySQL 就能將該查詢轉換為一個常量,system 是 const 類型的特例,當查詢的表只有一行的情況下,使用 system

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

五、possible_keys

指出 MySQL 能使用哪個索引在表中找到記錄,查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢使用(該查詢可以利用的索引,如果沒有任何索引顯示 null)

該列完全獨立于 EXPLAIN 輸出所示的表的次序。這意味著在 possible_keys 中的某些鍵實際上不能按生成的表次序使用。

如果該列是 NULL,則沒有相關的索引。在這種情況下,可以通過檢查 WHERE 子句看是否它引用某些列或適合索引的列來提高你的查詢性能。如果是這樣,創造一個適當的索引并且再次用 EXPLAIN 檢查查詢

六、Key

key 列顯示 MySQL 實際決定使用的鍵(索引),必然包含在 possible_keys 中

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

七、key_len

表示索引中使用的字節數,可通過該列計算查詢中使用的索引的長度(key_len 顯示的值為索引字段的最大可能長度,并非實際使用長度,即 key_len 是根據表定義計算而得,不是通過表內檢索出的)

不損失精確性的情況下,長度越短越好

八、ref

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

九、rows

估算出結果集行數,表示 MySQL 根據表統計信息及索引選用情況,估算的找到所需的記錄所需要讀取的行數

十、Extra

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

Using where: 不用讀取表中所有信息,僅通過索引就可以獲取所需數據,這發生在對表的全部的請求列都是同一個索引的部分的時候,表示 mysql 服務器將在存儲引擎檢索行后再進行過濾

Using temporary:表示 MySQL 需要使用臨時表來存儲結果集,常見于排序和分組查詢,常見 group by ; order by

Using filesort:當 Query 中包含 order by 操作,而且無法利用索引完成的排序操作稱為“文件排序”

--  測試 Extra 的 filesort
explain select * from emp order by name;

Using join buffer:改值強調了在獲取連接條件時沒有使用索引,并且需要連接緩沖區來存儲中間結果。如果出現了這個值,那應該注意,根據查詢的具體情況可能需要添加索引來改進能。

Impossible where:這個值強調了 where 語句會導致沒有符合條件的行(通過收集統計信息不可能存在結果)。

Select tables optimized away:這個值意味著僅通過使用索引,優化器可能僅從聚合函數結果中返回一行

No tables used:Query 語句中使用 from dual 或不含任何 from 子句

-- explain select now() from dual;

總結:

? EXPLAIN 不會告訴你關于觸發器、存儲過程的信息或用戶自定義函數對查詢的影響情況

? EXPLAIN 不考慮各種 Cache

? EXPLAIN 不能顯示 MySQL 在執行查詢時所作的優化工作

? 部分統計信息是估算的,并非精確值

? EXPALIN 只能解釋 SELECT 操作,其他操作要重寫為 SELECT 后查看執行計劃。

通過收集統計信息不可能存在結果

“mysql 中的 explain 怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-15發表,共計3762字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 正宁县| 江津市| 青神县| 天峨县| 库伦旗| 常宁市| 甘德县| 柳州市| 松桃| 胶南市| 济源市| 庆城县| 延边| 巴东县| 古交市| 石泉县| 广河县| 九寨沟县| 米脂县| 云龙县| 湘西| 黄骅市| 习水县| 古田县| 琼结县| 庐江县| 南漳县| 加查县| 新兴县| 双柏县| 宣汉县| 玛多县| 林周县| 德格县| 绥阳县| 邯郸县| 米易县| 福建省| 千阳县| 邹城市| 龙州县|