中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

MySQL中explain命令有什么用

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

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

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

語法:explain SQL語句例如:

1explain select * from user where id=1

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

  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

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

5. type

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

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

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

6. possible_keys

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

7. key

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

8. key_len

表示索引中使用的字節數。

9. ref

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

10. rows

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

11. Extra

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

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

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

-- 創建表
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命令有什么用

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

-- 添加一些數據
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命令有什么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

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

AI

华池县| 长乐市| 墨玉县| 嘉峪关市| 和顺县| 随州市| 南丹县| 琼海市| 绥芬河市| 禹州市| 德保县| 博爱县| 伊春市| 白沙| 竹溪县| 牡丹江市| 革吉县| 枞阳县| 绿春县| 博客| 高密市| 常熟市| 浦县| 陇西县| 山丹县| 白山市| 安溪县| 南雄市| 新化县| 盈江县| 宁南县| 麻江县| 名山县| 始兴县| 安丘市| 望谟县| 淳化县| 中牟县| 临高县| 南丰县| 汽车|