溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL中explain命令有什么用

發(fā)布時間:2021-07-29 14:03:40 來源:億速云 閱讀:153 作者:小新 欄目:MySQL數據庫

這篇文章主要介紹了MySQL中explain命令有什么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

下面來講講這個MySQL提供的explain命令:

語法:explain SQL語句例如:

1explain select * from user where id=1

執(zhí)行完畢之后,它的輸出有以下字段:

  id
  select_type
  table
  partitions
  type
  possible_keys
  key
  key_len
  ref
  rows
  Extra

要想知道explain命名怎么使用,就必須把這些字段搞清楚

1. id

SELECT查詢的標識符, 每個SELECT語句都會自動分配一個唯一的標識符

2. select_type

每個select查詢字句的類型,具體類型以及對應作用如下表:

類型名解釋
SIMPLE簡單SELECT,不使用UNION或子查詢等
PRIMARY查詢中若包含任何復雜的子部分,最外層的select被標記為PRIMARY
UNIONUNION中的第二個或后面的SELECT語句
DEPENDENT UNIONUNION中的第二個或后面的SELECT語句,取決于外面的查詢
UNION RESULTUNION的結果
SUBQUERY子查詢中的第一個SELECT
DEPENDENT SUBQUERY子查詢中的第一個SELECT,取決于外面的查詢
DERIVED派生表的SELECT, FROM子句的子查詢
UNCACHEABLE SUBQUERY一個子查詢的結果不能被緩存,必須重新評估外鏈接的第一行

3. table

顯示這一行的數據是查哪張表的,不過有時短路顯示的不是真實的表名。

4. partitions

匹配的分區(qū)(這個目前用處不大)

5. type

訪問類型,表示MySQL在表中找到所需行的方式,對應的值和解釋如下:

類型名優(yōu)級別解釋
system1表僅有一行
const2表最多有一個匹配行,在查詢開始時即被讀取
eq_ref3使用primary key或者unique key作為多表連接的條件,僅從該表中讀取一行
ref4作為查詢條件的索引在每個表匹配索引值的行從表中讀取出來
fulltext5全文索引檢索
ref_or_null6和ref一致,但增加了NULL值查詢支持
index_merge7表示使用了索引合并優(yōu)化方法
unique_subquery8使用了替換了in子查詢
index_subquery9使用了替換了in子查詢,但只適用于子查詢中的非唯一索引
range10只檢索給定范圍的行,使用一個索引來選擇行
index11全表掃描,但掃描表的方式是按索引的次序進行
ALL12全表掃描的方式找到匹配的行

type作為訪問類型,其值代表著當前查詢所用的類型,是體現(xiàn)性能的一個重要指標,從表中可以看到,從上到下,掃描表的方式越來越寬,性能也就越來越差,因此,對于一個查詢,最好能保持在range級別以上。

6. possible_keys

主動指出查詢能用哪個索引在表中找到記錄也就是會列出在查詢中的字段中有索引的字段,但不一定被查詢所用。

7. key

顯示再查詢中實際使用的索引/鍵,如果沒有索引,則顯示NULL。但如果想強制查詢中使用或忽視possible_keys列中的索引,則可以在查詢中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

8. key_len

表示索引中使用的字節(jié)數。

9. ref

表示哪些列或常量被用于查找索引列上的值。

10. rows

顯示當前查詢估算到的查找到匹配記錄所需的記錄行數。

11. Extra

顯示當前查詢所用的解決方式,它有以下幾種情況:

類型名解釋
Using where列數據是從僅僅使用了索引中的信息而沒有讀取實際的行動的表返回的,
Using temporary表示MySQL需要使用臨時表來存儲結果集,常見于排序和分組查詢
Using filesortMySQL中無法利用索引完成的排序操作稱為“文件排序”
Using join buffer改值強調了在獲取連接條件時沒有使用索引,并且需要連接緩沖區(qū)來存儲中間結果。如果出現(xiàn)了這個值,那應該注意,根據查詢的具體情況可能需要添加索引來改進能。
Impossible where這個值強調了where語句會導致沒有符合條件的行。
Select tables optimized away這個值意味著僅通過使用索引,優(yōu)化器可能僅從聚合函數結果中返回一行

講完了語法,我們來實際操作一波,首先創(chuàng)建個表:

-- 創(chuàng)建表
CREATE TABLE test(
id INT(11) NOT NULL AUTO_INCREMENT,
uname VARCHAR(255),
PRIMARY KEY(id) 
);

然后給uname字段加上索引:

-- 添加索引
ALTER TABLE test ADD INDEX uname_index (uname);

查看一下索引是否添加成功:

-- 查看是否有索引
SHOW INDEX FROM test;

輸出結果為:

MySQL中explain命令有什么用

可以看出索引已經創(chuàng)建成功,接下來添加一些數據:

-- 添加一些數據
INSERT INTO test VALUES(1,'jay');
INSERT INTO test VALUES(2,'ja');
INSERT INTO test VALUES(3,'bril');
INSERT INTO test VALUES(4,'aybar');

一切準備就緒,下面用explain這個命令來探究一些like語句是否有索引,like有四種情況,分別為沒有%、 %% 、左%、右%、

1. like 字段名

EXPLAIN SELECT * FROM test WHERE uname LIKE 'j';

輸出為:

MySQL中explain命令有什么用

可以看出:type的值為:range,key的值為uname_index,也就是說這種情況下,使用了索引。

2. like %字段名%

EXPLAIN SELECT * FROM test WHERE uname LIKE '%j%';

輸出為:

MySQL中explain命令有什么用

可以看出:type的值為ALL也就是全表掃描,而且key的值為NULL,也就是說沒用到任何索引。

3. like %字段名

EXPLAIN SELECT * FROM test WHERE uname LIKE '%j';

輸出為:

MySQL中explain命令有什么用

可以看出:type的值為ALL,key的值為NULL,同樣沒用到索引。

4. like 字段名%

EXPLAIN SELECT * FROM test WHERE uname LIKE 'j%';

輸出為:

MySQL中explain命令有什么用

可以看出:type的值為:range,key的值為uname_index,也就是說這種情況下,使用了索引。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“MySQL中explain命令有什么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業(yè)資訊頻道,更多相關知識等著你來學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI