MySQL中的explain怎么用
這篇文章給大家分享的是有關(guān)MySQL中的explain怎么用的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
分析sql的執(zhí)行計(jì)劃---explain
explain可以模擬sql優(yōu)化執(zhí)行sql語句。
1、explan使用簡介
(1)用戶表
(2)部門表
(3)未觸發(fā)索引
(4)觸發(fā)索引
(5)結(jié)果分析
explain中第一行出現(xiàn)的表是驅(qū)動表。
-
指定了聯(lián)接條件時,滿足查詢條件的記錄行數(shù)少的表為[驅(qū)動表]
-
未指定聯(lián)接條件時,行數(shù)少的表為[驅(qū)動表]
對驅(qū)動表直接進(jìn)行排序就會觸發(fā)索引,對非驅(qū)動表進(jìn)行排序不會觸發(fā)索引。
2、explain查詢結(jié)果簡介
(1)id:SELECT識別符。這是SELECT的查詢序列號。
(2)select_type:SELECT類型:
-
SIMPLE: 簡單SELECT(不使用UNION或子查詢)
-
PRIMARY: 最外面的SELECT
-
UNION:UNION中的第二個或后面的SELECT語句
-
DEPENDENT UNION:UNION中的第二個或后面的SELECT語句,取決于外面的查詢
-
UNION RESULT:UNION的結(jié)果
-
SUBQUERY:子查詢中的第一個SELECT
-
DEPENDENT SUBQUERY:子查詢中的第一個SELECT,取決于外面的查詢
-
DERIVED:導(dǎo)出表的SELECT(FROM子句的子查詢)
(3)table:表名
(4)type:聯(lián)接類型
-
system:表僅有一行(=系統(tǒng)表)。這是const聯(lián)接類型的一個特例。
-
const:表最多有一個匹配行,它將在查詢開始時被讀取。因?yàn)閮H有一行,在這行的列值可被優(yōu)化器剩余部分認(rèn)為是常數(shù)。const用于用常數(shù)值比較PRIMARY KEY或UNIQUE索引的所有部分時。
-
eq_ref:對于每個來自于前面的表的行組合,從該表中讀取一行。這可能是最好的聯(lián)接類型,除了const類型。它用在一個索引的所有部分被聯(lián)接使用并且索引是UNIQUE或PRIMARY KEY。eq_ref可以用于使用= 操作符比較的帶索引的列。比較值可以為常量或一個使用在該表前面所讀取的表的列的表達(dá)式。
-
ref:對于每個來自于前面的表的行組合,所有有匹配索引值的行將從這張表中讀取。如果聯(lián)接只使用鍵的最左邊的前綴,或如果鍵不是UNIQUE或PRIMARY KEY(換句話說,如果聯(lián)接不能基于關(guān)鍵字選擇單個行的話),則使用ref。如果使用的鍵僅僅匹配少量行,該聯(lián)接類型是不錯的。ref可以用于使用=或<=>操作符的帶索引的列。
-
ref_or_null:該聯(lián)接類型如同ref,但是添加了MySQL可以專門搜索包含NULL值的行。在解決子查詢中經(jīng)常使用該聯(lián)接類型的優(yōu)化。
-
index_merge:該聯(lián)接類型表示使用了索引合并優(yōu)化方法。在這種情況下,key列包含了使用的索引的清單,key_len包含了使用的索引的最長的關(guān)鍵元素。
-
unique_subquery:該類型替換了下面形式的IN子查詢的ref:value IN (SELECT primary_key FROMsingle_table WHERE some_expr);unique_subquery是一個索引查找函數(shù),可以完全替換子查詢,效率更高。
-
index_subquery:該聯(lián)接類型類似于unique_subquery。可以替換IN子查詢,但只適合下列形式的子查詢中的非唯一索引:value IN (SELECT key_column FROM single_table WHERE some_expr)
-
range:只檢索給定范圍的行,使用一個索引來選擇行。key列顯示使用了哪個索引。key_len包含所使用索引的最長關(guān)鍵元素。在該類型中ref列為NULL。當(dāng)使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比較關(guān)鍵字列時,可以使用range
-
index:該聯(lián)接類型與ALL相同,除了只有索引樹被掃描。這通常比ALL快,因?yàn)樗饕募ǔ1葦?shù)據(jù)文件小。
-
all:對于每個來自于先前的表的行組合,進(jìn)行完整的表掃描。如果表是第一個沒標(biāo)記const的表,這通常不好,并且通常在它情況下很差。通常可以增加更多的索引而不要使用ALL,使得行能基于前面的表中的常數(shù)值或列值被檢索出。
(5)possible_keys:possible_keys列指出MySQL能使用哪個索引在該表中找到行。注意,該列完全獨(dú)立于EXPLAIN輸出所示的表的次序。這意味著在possible_keys中的某些鍵實(shí)際上不能按生成的表次序使用。
(6)key:key列顯示MySQL實(shí)際決定使用的鍵(索引)。如果沒有選擇索引,鍵是NULL。要想強(qiáng)制MySQL使用或忽視possible_keys列中的索引,在查詢中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。
(7)key_len:key_len列顯示MySQL決定使用的鍵長度。如果鍵是NULL,則長度為NULL。注意通過key_len值我們可以確定MySQL將實(shí)際使用一個多部關(guān)鍵字的幾個部分。
(8)ref:ref列顯示使用哪個列或常數(shù)與key一起從表中選擇行。
(9)rows:rows列顯示MySQL認(rèn)為它執(zhí)行查詢時必須檢查的行數(shù)。
(10)Extra:該列包含MySQL解決查詢的詳細(xì)信息。
-
Distinct:MySQL發(fā)現(xiàn)第1個匹配行后,停止為當(dāng)前的行組合搜索更多的行。
-
Not exists:MySQL能夠?qū)Σ樵冞M(jìn)行LEFT JOIN優(yōu)化,發(fā)現(xiàn)1個匹配LEFT JOIN標(biāo)準(zhǔn)的行后,不再為前面的的行組合在該表內(nèi)檢查更多的行。
-
range checked for each record (index map: #):MySQL沒有發(fā)現(xiàn)好的可以使用的索引,但發(fā)現(xiàn)如果來自前面的表的列值已知,可能部分索引可以使用。對前面的表的每個行組合,MySQL檢查是否可以使用range或index_merge訪問方法來索取行。
-
Using filesort:MySQL需要額外的一次傳遞,以找出如何按排序順序檢索行。通過根據(jù)聯(lián)接類型瀏覽所有行并為所有匹配WHERE子句的行保存排序關(guān)鍵字和行的指針來完成排序。然后關(guān)鍵字被排序,并按排序順序檢索行。
-
Using index:從只使用索引樹中的信息而不需要進(jìn)一步搜索讀取實(shí)際的行來檢索表中的列信息。當(dāng)查詢只使用作為單一索引一部分的列時,可以使用該策略。
-
Using temporary:為了解決查詢,MySQL需要創(chuàng)建一個臨時表來容納結(jié)果。典型情況如查詢包含可以按不同情況列出列的GROUP BY和ORDER BY子句時。
-
Using where:WHERE子句用于限制哪一個行匹配下一個表或發(fā)送到客戶。除非你專門從表中索取或檢查所有行,如果Extra值不為Using where并且表聯(lián)接類型為ALL或index,查詢可能會有一些錯誤。
-
Using sort_union(...), Using union(...), Using intersect(...):這些函數(shù)說明如何為index_merge聯(lián)接類型合并索引掃描。
-
Using index for group-by:類似于訪問表的Using index方式,Using index for group-by表示MySQL發(fā)現(xiàn)了一個索引,可以用來查詢GROUP BY或DISTINCT查詢的所有列,而不要額外搜索硬盤訪問實(shí)際的表。并且,按最有效的方式使用索引,以便對于每個組,只讀取少量索引條目。
通過相乘EXPLAIN輸出的rows列的所有值,你能得到一個關(guān)于一個聯(lián)接如何的提示。這應(yīng)該粗略地告訴你MySQL必須檢查多少行以執(zhí)行查詢。當(dāng)你使用max_join_size變量限制查詢時,也用這個乘積來確定執(zhí)行哪個多表SELECT語句。
總結(jié)
以上是生活随笔為你收集整理的MySQL中的explain怎么用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 迪杰斯特拉算法简单分析
- 下一篇: 移动端APP应用版本升级更新方案:整包更