執行計畫分析
作用將優化器 選擇後的執行計畫 擷取出來.便於管理管判斷語句得執行效率.
獲取執行
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...