mysql explain用法

explain顯示了mysql如何使用索引來處理select語句以及連接表。可以幫助選擇更好的索引和寫出更優化的查詢語句。
使用方法,在select語句前加上explain就可以了,如:

explain select * from statuses_status where id=11;

創建測試表:

復制代碼
CREATE TABLE people(id int auto_increment primary key, zipcode char(32) not null default '', address varchar(128) not null default '', lastname char(64) not null default '', firstname char(64) not null default '', birthdate char(10) not null default '' ); CREATE TABLE people_car( people_id int, plate_number varchar(16) not null default '', engine_number varchar(16) not null default '', lasttime timestamp );
復制代碼

?插入測試數據:

復制代碼
insert into people
(zipcode,address,lastname,firstname,birthdate)
values
('230031','anhui','zhan','jindong','1989-09-15'), ('100000','beijing','zhang','san','1987-03-11'), ('200000','shanghai','wang','wu','1988-08-25') insert into people_car (people_id,plate_number,engine_number,lasttime) values (1,'A121311','12121313','2013-11-23 :21:12:21'), (2,'B121311','1S121313','2011-11-23 :21:12:21'), (3,'C121311','1211SAS1','2012-11-23 :21:12:21')
復制代碼

?創建索引用來測試

alter table people add index(zipcode,firstname,lastname);

?explain介紹

先從一個最簡單的查詢開始:

Query-1
explain select zipcode,firstname,lastname from people;

?explain輸出結果共有id,select_type,table,type,possible_keys,key,key_len,ref,rows和Extra幾列。每一列分別代表什么意思呢,請看下面的解釋。

select_type 表示查詢中每個select語句的類型(簡單 OR復雜),可以有下面幾種

a.SIMPLE:最簡單的SELECT查詢,沒有使用UNION或子查詢,見Query-1。

b.PRIMARY:在嵌套的查詢中是最外層的SELECT語句,在UNION查詢中是最前面的SELECT語句。見Query-2和Query-3。

??????????????????? 查詢中若包含任何復雜的子部分,最外層查詢則被標記為:PRIMARY

Query-2
explain select zipcode from (select * from people a) b;

Query-3
explain select * from people where zipcode = 100000 union select * from people where zipcode = 200000;

c.UNION:UNION中第二個以及后面的SELECT語句。見Query-3。

d.DERIVED:派生表SELECT語句中FROM子句中的SELECT語句。見Query-2。

e.UNION RESULT:一個UNION查詢的結果。見Query-3。

f.DEPENDENT UNION:顧名思義,首先需要滿足UNION的條件,及UNION中第二個以及后面的SELECT語句,同時該語句依賴外部的查詢。

Query-4
explain select * from people where id in (select id from people where zipcode = 100000 union select id from people where zipcode = 200000 );

g.SUBQUERY:子查詢中第一個SELECT語句。

Query-6
explain select * from people where id = (select id from people where zipcode = 100000);

table :顯示的這一行信息是關于哪一張表的。有時候并不是真正的表名。

Query-7
explain select * from (select * from (select * from people a) b ) c;

可以看到如果指定了別名就顯示的別名。
<derivedN>N就是id值,指該id值對應的那一步操作的結果。
還有<unionM,N>這種類型,出現在UNION語句中,見Query-4。
注意:MySQL對待這些表和普通表一樣,但是這些“臨時表”是沒有任何索引的。

type
type列很重要,是用來說明表與表之間是如何進行關聯操作的,有沒有使用索引。MySQL中“關聯”一詞比一般意義上的要寬泛,MySQL認為任何一次查詢都是一次“關聯”,并不僅僅是一個查詢需要兩張表才叫關聯,所以也可以理解MySQL是如何訪問表的。主要有下面幾種類別。

const

當確定最多只會有一行匹配的時候,MySQL優化器會在查詢前讀取它而且只讀取一次,因此非常快。const只會用在將常量和主鍵或唯一索引進行比較時,而且是比較所有的索引字段。people表在id上有一個主鍵索引,在(zipcode,firstname,lastname)有一個二級索引。因此Query-8的type是const而Query-9并不是:

Query-8
explain select * from people where id=1;

Query-9
explain select * from people where zipcode = 100000;

注意下面的Query-10也不能使用const table,雖然也是主鍵,也只會返回一條結果。

Query-10
explain select * from people where id >2;

system
這是const連接類型的一種特例,表僅有一行滿足條件。

Query-11
explain select * from (select * from people where id = 1 )b;

<derived2>已經是一個const table并且只有一條記錄。

eq_ref

唯一性索引掃描,對于每個索引鍵,表中只有一條記錄與之匹配。 常見于主鍵或唯一索引掃描。eq_ref類型是除了const外最好的連接類型。
創建員工表Employee和經理表Manager

復制代碼
create table Employee
(ID int auto_increment,Ename varchar(32), Age int, Salary float, MID int, Primary key (ID) ); create table Manager ( MID int, Name varchar(32), Primary key(MID) );
復制代碼
Query-12
explain select * from Employee A,Manager B where A.MID=B.MID;

MID對于表Manager是唯一的,主鍵索引,來與employee連接,故type為eq_ref。

ref

非唯一性索引掃描,返回匹配某個單獨值的所有行。常見于使用非唯一索引即唯一索引的非唯一前綴進行的查找。
這個類型跟eq_ref不同的是,它用在關聯操作只使用了索引的最左前綴,或者索引不是UNIQUE和PRIMARY KEY。ref可以用于使用=或<=>操作符的帶索引的列。

Query-13
explain select * from people where zipcode='100000';

?

zipcode、firstname和lastname組成索引,這里只使用了name,即只使用了唯一性索引的一部分,故為ref。

fulltext
鏈接是使用全文索引進行的。一般我們用到的索引都是B樹,這里就不舉例說明了。
ref_or_null
該類型和ref類似。但是MySQL會做一個額外的搜索包含NULL列的操作。在解決子查詢中經常使用該聯接類型的優化。

range

只檢索給定范圍的行,使用一個索引來選擇行。key列顯示使用了哪個索引。key_len包含所使用索引的最長關鍵元素。在該類型中ref列為NULL。當使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比較關鍵字列時,可以使用range。

索引范圍掃描,對索引的掃描開始于某一點,返回匹配值域的行, 常見于between、<、>,IN等的查詢。

Query-14
explain select * from people where id=1 or id=2;

Query-15
explain select * from people where id>1;

Query-16
explain select * from people where id in (1,2);

index
該聯接類型與ALL相同,除了只有索引樹被掃描。這通常比ALL快,因為索引文件通常比數據文件小。這個類型通常的作用是告訴我們查詢是否使用索引進行排序操作。

按索引掃描表,雖然還是全表掃描,但優點是索引是有序的。index與ALL區別為index類型只遍歷索引樹。

Query-17
explain select * from people order by id;

ALL
最慢的一種方式,即全表掃描。

總結

explain的type列從最差到最好依次是:
ALL:全表掃描。
index:索引掃描。?
range:索引范圍掃描。
ref :非唯一性索引掃描。?
eq_ref :唯一性索引掃描。?
const,system:將查詢轉換為一個常量。?
null:MySQL在優化過程中分解語句,執行時甚至不用訪問表或索引

possible_keys
possible_keys列指出MySQL能使用哪個索引在該表中找到行。查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢使用。

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

key_len
key_len列顯示MySQL決定使用的鍵長度。如果鍵是NULL,則長度為NULL。使用的索引的長度。在不損失精確性的情況下,長度越短越好 。

ref
ref列顯示使用哪個列或常數與key一起從表中選擇行。
表示上述表的連接匹配條件,即哪些列或常量被用于查找索引列上的值。

rows
rows列顯示MySQL認為它執行查詢時必須檢查的行數。注意這是一個預估值。

Extra
Extra是EXPLAIN輸出中另外一個很重要的列,該列顯示MySQL在查詢過程中的一些詳細信息,包含的信息很多,只選擇幾個重點的介紹下。

Using filesort?
MySQL有兩種方式可以生成有序的結果,通過排序操作或者使用索引,當Extra中出現了Using filesort 說明MySQL使用了后者,但注意雖然叫filesort但并不是說明就是用了文件來進行排序,只要可能排序都是在內存里完成的。大部分情況下利用索引排序更快,所以一般這時也要考慮優化查詢了。

Using temporary
說明使用了臨時表,一般看到它說明查詢需要優化了,就算避免不了臨時表的使用也要盡量避免硬盤臨時表的使用。

Not exists
MYSQL優化了LEFT JOIN,一旦它找到了匹配LEFT JOIN標準的行, 就不再搜索了。

Using index?
說明查詢是覆蓋了索引的,這是好事情。MySQL直接從索引中過濾不需要的記錄并返回命中的結果。這是MySQL服務層完成的,但無需再回表查詢記錄。

Using index condition
這是MySQL 5.6出來的新特性,叫做“索引條件推送”。簡單說一點就是MySQL原來在索引上是不能執行如like這樣的操作的,但是現在可以了,這樣減少了不必要的IO操作,但是只能用在二級索引上。

Using where
使用了WHERE從句來限制哪些行將與下一張表匹配或者是返回給用戶。

注意:Extra列出現Using where表示MySQL服務器將存儲引擎返回服務層以后再應用WHERE條件過濾。


轉自:http://www.cnblogs.com/xiaoxi/p/5688096.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443314.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443314.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443314.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 性能檢查命令總結

如果你的Linux服務器突然負載暴增&#xff0c;告警短信快發爆你的手機&#xff0c;如何在最短時間內找出Linux性能問題所在&#xff1f;

線程池的各種使用場景

&#xff08;1&#xff09;高并發、任務執行時間短的業務&#xff0c;線程池線程數可以設置為CPU核數1&#xff0c;減少線程上下文的切換 &#xff08;2&#xff09;并發不高、任務執行時間長的業務要區分開看&#xff1a; a&#xff09;假如是業務時間長集中在IO操作上…

Java線程面試題 Top 50

不管你是新程序員還是老手&#xff0c;你一定在面試中遇到過有關線程的問題。Java語言一個重要的特點就是內置了對并發的支持&#xff0c;讓Java大受企業和程序員的歡迎。大多數待遇豐厚的Java開發職位都要求開發者精通多線程技術并且有豐富的Java程序開發、調試、優化經驗&…

深入理解Semaphore

使用 Semaphore是計數信號量。Semaphore管理一系列許可證。每個acquire方法阻塞&#xff0c;直到有一個許可證可以獲得然后拿走一個許可證&#xff1b;每個release方法增加一個許可證&#xff0c;這可能會釋放一個阻塞的acquire方法。然而&#xff0c;其實并沒有實際的許可證這…

【算法系列之四】柱狀圖儲水

題目&#xff1a; 給定一個數組&#xff0c;每個位置的值代表一個高度&#xff0c;那么整個數組可以看做是一個直方圖&#xff0c; 如果把這個直方圖當作容器的話&#xff0c;求這個容器能裝多少水 例如&#xff1a;3&#xff0c;1&#xff0c;2&#xff0c;4 代表第一個位…

鹽城大數據產業園人才公寓_岳西大數據產業園規劃設計暨建筑設計方案公布,搶先一睹效果圖...

近日&#xff0c;岳西縣大數據產業園規劃設計暨建筑設計方案公布。岳西縣大數據產業園項目總占地面積17014.10㎡(約合25.52畝)&#xff0c;擬建總建筑面積約為61590.84㎡(地上建筑面積39907.49㎡&#xff0c;地下建筑面積21602.35㎡)。以“科技圓環”為主題&#xff0c;組建出一…

【算法系列之五】對稱二叉樹

給定一個二叉樹&#xff0c;檢查它是否是鏡像對稱的。 例如&#xff0c;二叉樹 [1,2,2,3,4,4,3] 是對稱的。 1/ \2 2/ \ / \ 3 4 4 3但是下面這個 [1,2,2,null,3,null,3] 則不是鏡像對稱的: 1/ \2 2\ \3 3 說明: 如果你可以運用遞歸和迭代兩種方法解決這個問題&a…

【算法系列之六】兩整數之和

不使用運算符 和 - &#xff0c;計算兩整數 a 、b 之和。 示例 1: 輸入: a 1, b 2 輸出: 3示例 2: 輸入: a -2, b 3 輸出: 1 方法一&#xff1a;遞歸 public static int getSum1(int a, int b) {if ((a & b) ! 0) { // 判斷是否有進位return getSum1(a ^ b, (a &…

cuda默認函數與c++沖突_好程序員Python教程系列-第8講:函數和模塊

好程序員Python教程系列-第8講&#xff1a;函數和模塊&#xff0c;在講解本章節的內容之前&#xff0c;我們先來研究一道數學題&#xff0c;請說出下面的方程有多少組正整數解。事實上&#xff0c;上面的問題等同于將8個蘋果分成四組每組至少一個蘋果有多少種方案&#xff0c;所…

【算法系列之七】合并兩個有序鏈表

將兩個有序鏈表合并為一個新的有序鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。 示例&#xff1a; 輸入&#xff1a;1->2->4, 1->3->4 輸出&#xff1a;1->1->2->3->4->4/*** Definition for singly-linked list.* public cla…

mfc讓圖片與按鈕一起_對許多張圖片進行批量裁剪,看看我是如何快速做到的

概要&#xff1a;當我們需要對很多圖片進行批量裁剪時&#xff0c;以往的辦法是自己一張一張圖片去操作&#xff0c;非常麻煩。有沒有這樣一個工具&#xff0c;能夠幫我們批量進行處理呢&#xff1f;之前小編在網上找了非常多的軟件&#xff0c;一個一個地安裝試用&#xff0c;…

【算法系列之八】刪除鏈表的倒數第N個節點

給定一個鏈表&#xff0c;刪除鏈表的倒數第 n 個節點&#xff0c;并且返回鏈表的頭結點。 示例&#xff1a; 給定一個鏈表: 1->2->3->4->5, 和 n 2.當刪除了倒數第二個節點后&#xff0c;鏈表變為 1->2->3->5.說明&#xff1a; 給定的 n 保證是有效的…

手寫分頁sql_分頁查詢SQL語句

表結構&#xff1a;DROP TABLE IF EXISTS zhoufoxcn.userlist;CREATE TABLE zhoufoxcn.userlist (UserId int(10) unsigned NOT NULL auto_increment,UserName varchar(45) NOT NULL,Age int(10) unsigned NOT NULL default 10,Sex tinyint(3) unsigned NOT NULL default 1,Ta…

【算法系列之九】合并兩個有序數組

給定兩個有序整數數組 nums1 和 nums2&#xff0c;將 nums2 合并到 nums1 中&#xff0c;使得 num1 成為一個有序數組。 說明: 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。你可以假設 nums1 有足夠的空間&#xff08;空間大小大于或等于 m n&#xff09;來保存 nums2 …

把網卡指定給vm虛擬機_為VMWare虛擬網卡指定靜態的MAC地址

當你把虛擬機移到另一臺主機或在同一臺主機但不同的路徑時&#xff0c;虛擬機的MAC地址將會更改。默認情況下VMWare會保證MAC地址的唯一性卻不保存固定性&#xff0c;在每次開啟虛擬機里的系統時都可能重新分配MAC地址來保證唯一性&#xff0c;若你想保證即使虛擬機被移動后&am…

【算法系列之十】三數之和

給定一個包含 n 個整數的數組 nums&#xff0c;判斷 nums 中是否存在三個元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;找出所有滿足條件且不重復的三元組。 注意&#xff1a;答案中不可以包含重復的三元組。 例如, 給定數組 nums [-1, 0, 1,…

android 動態獲取全縣_省市縣 ------ 三級滾動(android)

預先加載仿滾輪實現的全部數據mCityPickerView.init(this);③ 點擊響應&#xff1a;ss.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {CityConfig cityConfig new CityConfig.Builder().title("選擇城市")//標題.build();m…

發電廠電氣部分第三版pdf_火力發電廠電氣主接線的特點

根據火力發電廠的容量及其在電力系統中的地位&#xff0c;一般可將火力發電廠分為區域性火力發電廠和地方性火力發電廠。這兩類火力發電廠的電氣主接線有各自的特點。一、區域性火力發電廠的電氣主接線1、單機容量及總裝機容量都較大單機容量多為300MW、600MW和少量1000MW,電廠…

【算法系列之十一】k個一組翻轉鏈表

給出一個鏈表&#xff0c;每 k 個節點一組進行翻轉&#xff0c;并返回翻轉后的鏈表。 k 是一個正整數&#xff0c;它的值小于或等于鏈表的長度。如果節點總數不是 k 的整數倍&#xff0c;那么將最后剩余節點保持原有順序。 示例 : 給定這個鏈表&#xff1a;1->2->3-&g…

ghostblog主題_讀Ghost博客源碼與自定義Ghost博客主題

我使用的Ghost博客一直使用者默認的Casper主題。我向來沒怎么打理過自己博客&#xff0c;一方面認為自己不夠專業&#xff0c;很難寫出質量比較高的文字&#xff1b;另一方面認為博客太耗時間&#xff0c;很容易影響正常的工作內容。最近公司即將搬遷&#xff0c;我的開發工作也…