MySQL使用explain檢查索引執行計畫

2021-09-11 20:53:48 字數 3820 閱讀 6422

執行計畫分析

作用將優化器 選擇後的執行計畫 擷取出來.便於管理管判斷語句得執行效率.

獲取執行

desc sql語句

explain sql 語句

這裡desc和explain的效果是一樣的

mysql> explain select * from test where name=『tom』\g

*************************** 1. row ***************************

id: 1

select_type: ******

table: test

type: all

possible_keys: null

key: null

key_len: null

ref: null

rows: 5

extra: using where

這裡我們看到查尋方式是all全表掃瞄,possible_keys可能走的索引為空,key實際走的索引頁為空,rows掃瞄了幾行才找到指定資料

我們建立一下索引,檢視一下效率

mysql> create index name_index on test(name);

mysql> explain select * from test where name=『tom』\g

*************************** 1. row ***************************

id: 1

select_type: ******

table: test

type: ref

possible_keys: name_index

key: name_index

key_len: 61

ref: const

rows: 1

extra: using index condition

查尋方式ref,可能走的索引和實際走的索引均是我們剛剛建立的name_index,rows這裡我們只掃瞄了1行效率大大提公升

這裡我們最需要關注的幾個引數時:type查尋方式 key實際走的索引 row 找到所需資料估計要查尋的行數

select_type

查詢型別

****** 簡單查詢

primary 最外層查詢

subquery 對映為子查詢

derived 子查詢

union 聯合

union result 使用聯合的結果

…table

正在訪問的表名

type

查詢時的訪問方式,效能:all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const

all 全表掃瞄,對於資料表從頭到尾找一遍

select * from tb1;

特別的:如果有limit限制,則找到之後就不在繼續向下掃瞄

select * from tb1 where email = 『[email protected]

select * from tb1 where email = 『[email protected]』 limit 1;

雖然上述兩個語句都會進行全表掃瞄,第二句使用了limit,則找到乙個後就不再繼續掃瞄。

index           全索引掃瞄,對索引從頭到尾找一遍

select nid from tb1;

range 對索引列進行範圍查詢

mysql> desc select * from city where id>2000;

mysql> desc select * from city where countrycode like 'ch%';

對於輔助索引來講,!= 和not in等語句是不走索引的

對於主鍵索引列來講,!= 和not in等語句是走range

===mysql> desc select * from city where countrycode='chn' or countrycode='usa';

mysql> desc select * from city where countrycode in ('chn','usa');

一般改寫為 union all

desc

select * from city where countrycode='chn'

union all

select * from city where countrycode='usa';

index_merge 合併索引,使用多個單列索引搜尋

select * from tb1 where name = 'alex' or nid in (11,22,33);

ref 根據索引查詢乙個或多個值

select * from tb1 where name = 'seven';

eq_ref 連線時使用primary key 或 unique型別

select tb2.nid,tb1.name from tb2 left join tb1 on tb2.nid = tb1.nid;

const 常量

表最多有乙個匹配行,因為僅有一行,在這行的列值可被優化器剩餘部分認為是常數,const表很快,因為它們只讀取一次。

select nid from tb1 where nid = 2 ;

system 系統

表僅有一行(=系統表)。這是const聯接型別的乙個特例。

select * from (select nid from tb1 where nid = 1) as a;

possible_keys

可能使用的索引

key真實使用的

key_len

mysql中使用索引位元組長度

varchar(20) utf8mb4

1. 能存20個任意字元

2. 不管儲存的時字元,數字,中文,都1個字元最大預留長度是4個位元組

3. 對於中文,1個佔4個位元組

4. 對於數字和字母,1個實際占用大小是1個位元組

select length() from test;

rows

mysql估計為了找到所需的行而要讀取的行數 ------ 只是預估值

extra

該列包含mysql解決查詢的詳細資訊

「using index」

此值表示mysql將使用覆蓋索引,以避免訪問表。不要把覆蓋索引和index訪問型別弄混了。

「using where」

這意味著mysql伺服器將在儲存引擎檢索行後再進行過濾,許多where條件裡涉及索引中的列,當(並且如果)它讀取索引時,就能被儲存引擎檢驗,因此不是所有帶where子句的查詢都會顯示「using where」。有時「using where」的出現就是乙個暗示:查詢可受益於不同的索引。

「using temporary」

這意味著mysql在對查詢結果排序時會使用乙個臨時表。

「using filesort」

這意味著mysql會對結果使用乙個外部索引排序,而不是按索引次序從表裡讀取行。mysql有兩種檔案排序演算法,這兩種排序方式都可以在記憶體或者磁碟上完成,explain不會告訴你mysql將使用哪一種檔案排序,也不會告訴你排序會在記憶體裡還是磁碟上完成。

「range checked for each record(index map: n)」

這個意味著沒有好用的索引,新的索引將在聯接的每一行上重新估算,n是顯示在possible_keys列中索引的點陣圖,並且是冗餘的。

MySQL使用EXPLAIN分析SQL

explain 關鍵字詳解 使用explain 關鍵字可以模擬優化器執行sql 查詢語句,從而知道mysql資料庫是如何處理你的sql 語句的。因此我們可以使用該關鍵字知道我們編寫的sql 語句是否是高效的,從而可以提高我們程式猿編寫sql 的能力。使用explain 關鍵字可以讓我們知道表的讀取順...

MySQL中explain使用詳解

一.explain explain顯示了mysql如何使用索引來處理select語句以及連線表。可以幫助選擇更好的索引和優化查詢語句。二.主要包含的列以及列的含義 1.id select識別符,指第幾個select。id值如果相同,可以認為是一組,從上往下執行 在所有組中,id值越大,優先順序越高,...

MySql的Explain命令使用

mysql的explain命令使用 explain命令是mysql自帶的乙個命令,用於解釋mysql將如何處理sql,執行順序和是否使用了索引之類,我們平常可以用於sql調優。用法則是,在sql前面加上這個命令,比如我們的sql為,select from table 那麼我們使用這個命令則是 exp...