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

mysql通過explain獲取查詢執行計劃的信息

146次閱讀
沒有評論

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

這篇文章主要介紹“mysql 通過 explain 獲取查詢執行計劃的信息”,在日常操作中,相信很多人在 mysql 通過 explain 獲取查詢執行計劃的信息問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”mysql 通過 explain 獲取查詢執行計劃的信息”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!

explain 獲取查詢執行計劃的信息
查詢中的 select 關鍵字之前增加 explain,執行查詢時返回有關于執行計劃中的每一步信息。
mysql select 1\G;
*
1. row
*
1: 1
1 row in set (0.00 sec)

ERROR:
No query specified

mysql explain select 1\G;
*
1. row
*
  id: 1
 select_type: SIMPLE
table: NULL
  partitions: NULL
type: NULL
possible_keys: NULL
 key: NULL
 key_len: NULL
 ref: NULL
rows: NULL
filtered: NULL
Extra: No tables used
1 row in set, 1 warning (0.00 sec)

ERROR:
No query specified

explain 兩個變種
explain extended:告訴服務器“逆向編譯”執行計劃為一個 select 語音,可以通過緊接其后運行 show warnings 看到這個生成的語句。這個語句直接來自執行計

劃,而不是原 sql 語句,到這個點上已經變成一個數據結構。可以檢測查詢優化器到底是如何轉化語句的。explain extended 在 Mysql 和更新后版本中可用
explain partitions 會顯示查詢將訪問的分區,如果查詢是基于分區表。在 Mysql5.1 和更新版本中存在。

explain 中的列
id 列
編號,標識 select 所屬行,如果在語句當中沒有子查詢或聯合,那么只有唯一的 select,于是每一行在這個列中都將顯示 1. 否則內層的 select 語句一般會順序編

,對應其在原始語句中的位置
mysql 將 select 查詢分為簡單和復雜類型,復雜類型可分為三大類: 簡單子查詢、所謂的派生表(from 子句中的子查詢)、UNION 查詢。

例:
簡單查詢:select 1;
復雜 - 簡單子查詢:select(select 1 from us_user limit 1) from us_user_role;
復雜 - 派生表:select * from us_user where id in (select user_id from us_user_role);
復雜 union 查詢:select 1 union select 2;

select_type 列
顯示對應行是簡單還是復雜的 select,如果是復雜 select,顯示是三種復雜類型中的哪一種。SIMPLE 值意味著查詢不包括子查詢和 union。如果查詢有任何復雜的

子部分,則最外層部分標記為 PRIMARY,其他部分標記如下。

SUBQUERY:包含在 select 列表中的子查詢中的 select(不在 from 子句中)標記為 subquery。
DERIVED:包含在 FROM 子句的子查詢中的 select,MYSQL 會遞歸執行并將結果放到一個臨時表中,服務器內部稱其“派生表”,因為該臨時表從子查詢中派生來的
UNION:在 UNION 中第二個和隨后的 select 被標記為 UNION
UNION RESULT:用來從 UNION 的匿名臨時表檢索的 SELECT 標記為 UNION RESULT.

table 列
顯示對應正在訪問那個表。或者該表的別名(如果 sql 中定義了別名)
當 from 子句中有子查詢時,table 列是格式,表示當前查詢依賴 id=N 的查詢,于是先執行 id=N 的查詢。當有 union 時,UNION RESULT 的

table 列的值為,1 和 2 表示參與 union 的 select 行 id。

partitions
訪問的分區

type
表示管理類型或訪問類型,即 mysql 決定如何查找表中的行。
依次從最優到最差分別為:system const eq_ref ref fulltext ref_or_null index_merge unique_subquery index_subquery range

index ALL

const, system:mysql 能對查詢的某部分進行優化并將其轉化成一個常量(可以看 show warnings 的結果)。用于 primary key 或 unique key 的所有列與常數

比較時,所以表最多有一個匹配行,讀取 1 次,速度比較快。

eq_ref:primary key 或 unique key 索引的所有部分被連接使用,最多只會返回一條符合條件的記錄。這可能是在 const 之外最好的聯接類型了,簡單的

select 查詢不會出現這種 type。

ref:相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前綴,索引要和某個值相比較,可能會找到多個符合條件的行。

ref_or_null:類似 ref,但是可以搜索值為 NULL 的行。

index_merge:表示使用了索引合并的優化方法。

range:范圍掃描通常出現在 in(), between , , , = 等操作中。使用一個索引來檢索給定范圍的行。

index:和 ALL 一樣,不同就是 mysql 只需掃描索引樹,這通常比 ALL 快一些。

ALL:即全表掃描,意味著 mysql 需要從頭到尾去查找所需要的行。通常情況下這需要增加索引來進行優化了

NULL:mysql 能夠在優化階段分解查詢語句,在執行階段用不著再訪問表或索引。例如:在索引列中選取最小值,可以單獨查找索引來完成,不需要在執行時訪問

possible_keys 列
顯示查詢可以使用那些索引。
explain 時可能出現 possible_keys 有值,而 key 顯示 NULL 的情況,這種情況是因為表中數據不多,mysql 認為索引對此查詢幫助不大,選擇了全表查詢。
如果該列是 NULL,則沒有相關的索引。在這種情況下,可以通過檢查 where 子句看是否可以創造一個適當的索引來提高查詢性能,然后用 explain 查看效果。

key 列
這一列顯示 mysql 實際采用哪個索引來優化對該表的訪問。
如果沒有使用索引,則該列是 NULL。如果想強制 mysql 使用或忽視 possible_keys 列中的索引,在查詢中使用 force index、ignore index。

key_len 列
這一列顯示了 mysql 在索引里使用的字節數,通過這個值可以算出具體使用了索引中的哪些列。

key_len 計算規則如下:

字符串
char(n):n 字節長度
varchar(n):2 字節存儲字符串長度,如果是 utf-8,則長度 3n + 2
數值類型
tinyint:1 字節
smallint:2 字節
int:4 字節
bigint:8 字節
時間類型
date:3 字節
timestamp:4 字節
datetime:8 字節
如果字段允許為 NULL,需要 1 字節記錄是否為 NULL
索引最大長度是 768 字節,當字符串過長時,mysql 會做一個類似左前綴索引的處理,將前半部分的字符提取出來做索引。

ref 列
這一列顯示了在 key 列記錄的索引中,表查找值所用到的列或常量,常見的有:const(常量),func,NULL

rows 列
這一列是 mysql 估計要讀取并檢測的行數,注意這個不是結果集里的行數。

filtered 列
顯示針對表里面符合某個條件(Where 子句或聯接條件)的記錄數的百分比做一個悲觀估算,如果把 rows 列和這個百分比相乘,就能看到 mysql 估算他將和查詢記

錄里面前一個表關聯的行數。

Extra 列
包含的是不適合其他列顯示的額外信息。
常見的最重要的值如下:

Using index:這發生在對表的請求列都是同一索引的部分的時候,返回的列數據只使用了索引中的信息,而沒有再去訪問表中的行記錄。是性能高的表現。
distinct: 一旦 mysql 找到了與行相聯合匹配的行,就不再搜索了
Using where:mysql 服務器將在存儲引擎檢索行后再進行過濾。就是先讀取整行數據,再按 where 條件進行檢查,符合就留下,不符合就丟棄。
Using temporary:mysql 需要創建一張臨時表來處理查詢。出現這種情況一般是要進行優化的,首先是想到用索引來優化。
Using filesort:mysql 會對結果使用一個外部索引排序,而不是按索引次序從表里讀取行。此時 mysql 會根據聯接類型瀏覽所有符合條件的記錄,并保存排序關鍵字和行指針,然后排序關鍵字并按順序檢索行信息。這種情況下一般也是要考慮使用索引來優化的。

到此,關于“mysql 通過 explain 獲取查詢執行計劃的信息”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注丸趣 TV 網站,丸趣 TV 小編會繼續努力為大家帶來更多實用的文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-28發表,共計3620字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 谢通门县| 尉氏县| 武邑县| 万宁市| 宾阳县| 澳门| 昭觉县| 子长县| 博客| 唐山市| 扶绥县| 瑞昌市| 丰城市| 区。| 荥经县| 辉南县| 略阳县| 十堰市| 咸阳市| 建湖县| 武鸣县| 丰宁| 金华市| 蕉岭县| 红河县| 蕲春县| 读书| 阿荣旗| 泰来县| 宜昌市| 南漳县| 金门县| 青州市| 增城市| 四川省| 章丘市| 东乌珠穆沁旗| 万山特区| 陕西省| 北流市| 正蓝旗|