2.執行計畫包含的資訊
我們都知道mysql對於一條sql在執行過程中會對它進行優化,而對於查詢語句的來說最好的優化方案就是使用索引。而執行計畫就是顯示mysql執行sql時的詳細執**況。其中包含了是否使用索引,使用了那些索引…
create table `user` (
`id` bigint(20) not null auto_increment,
`username` varchar(100) default null,
`password` varchar(100) default null,
primary key (`id`),
key `idx_name` (`username`)
) engine=innodb auto_increment=3 default charset=latin1
address表:
create table `address` (
`id` bigint(20) not null auto_increment,
`user_id` bigint(20) default null,
`address` varchar(200) character set utf8 default null,
primary key (`id`)
) engine=innodb auto_increment=3 default charset=latin1
表資料如下:
user表:
idusername
password1p1
1232
p2456
address表:
iduser_id
address11
邯鄲22德州
explain select * from user;
explain 的extended 擴充套件能夠在原本explain的基礎上額外的提供一些查詢優化的資訊,這些資訊可以通過mysql的show warnings命令得到。
explain extended select * from user;
explain partitions select * from user;
不同版本的mysql和不同的儲存引擎執行計畫不完全相同,但基本資訊都差不多。mysql執行計畫主要包含以下資訊:
idselect_type
table
type
possible_keys
keykey_len
refrows
extra
1******
user
allnull
null
null
null
1null
由一組數字組成,表示乙個查詢中各個子查詢的執行順序。
idid不同情況
執行順序
1id相同
執行順序由上至下
2id不同
值越大優先順序越高,越先被執行
3id為null
表示乙個結果集,不需要使用它查詢,常出現在包含union等查詢語句中
idselect_type
description舉例1
******
不包含任何子查詢或union等查詢
explain select * from user where id=1;
2primary
包含子查詢最外層查詢就顯示為primary
explain select * fromuser
where id=(select user_id from address where id=1);
3subquery
在select
或where
字句中包含的查詢
explain select * fromuser
where id=(select user_id from address where id=1);
4derived
from
字句中包含的查詢(衍生查詢)
explain select * from (select * from user where id>1) t;
5union
出現在union
後的查詢語句中(當前執行計畫的中間記錄
就是 union result))
explain select * from user where id=1 union select * from user where id=2;
6union result
從union中獲取結果集當前執行計畫的最後一條記錄
就是 union result)
explain select * from user where id=1 union select * from user where id=2;(
如果查詢使用了別名,那麼這裡顯示的是別名,如果不涉及對資料表的操作,那麼這顯示為null,如果顯示為尖括號括起來的就表示這個是臨時表,後邊的n就是執行計畫中的id,表示結果來自於這個查詢產生。如果是尖括號括起來的,與類似,也是乙個臨時表,表示這個結果來自於union查詢的id為m,n的結果集。
idtype
含義例子
1all
全表掃瞄(沒有使用到索引)
explain select * from user where password=『1』;
2index
遍歷索引(只查詢索引列)
explain select id from user ;
3range
索引範圍查詢(在索引列新增範圍查詢)
explain select id from user where id>1;
4index_subquery
在子查詢中使用 ref
暫時沒有找到例子
5unique_subquery
在子查詢中使用 eq_ref
暫時沒有合適例子
6ref_or_null
對null進行索引的優化的 ref
暫時沒有合適例子
7fulltext
使用全文索引
暫時沒有合適例子
8ref
使用非唯一索引查詢資料
explain select id fromuser
where username=『p1』;
9eq_ref
在join查詢中使用 primary key or unique not null索引關聯 (這裡需要把address的user_id設定為unique型別的索引)
explain select * from user u left join address a on u.id=a.user_id where a.id>1;
10const
使用主鍵或者唯一索引,且匹配的結果只有一條記錄
explain select * fromuser
where id=1;
11system const
連線型別的特例,查詢的表為系統表
效能從好到差依次為:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,all,除了all之外,其他的type都可以使用到索引,除了index_merge之外,其他的type只可以用到乙個索引。
所以,如果通過執行計畫發現某張表的查詢語句的type顯示為all,那就要考慮新增索引,或者更換查詢方式,使用索引進行查詢。
注意不一定會使用。查詢涉及到的字段上若存在索引,則該索引將被列出來。當該列為null
時就要考慮當前的sql
是否需要優化了。
顯示mysql在查詢中實際使用的索引,若沒有使用索引,顯示為null。
tips:查詢中若使用了覆蓋索引(覆蓋索引:索引的資料覆蓋了需要查詢的所有資料),則該索引僅出現在key列表中。select_type為index_merge時,這裡可能出現兩個以上的索引,其他的select_type這裡只會出現乙個。
char()、varchar()索引長度的計算公式:
(character set:utf8mb4=4,utf8=3,gbk=2,latin1=1) * 列長度 + 1(允許null) + 2(變長列)
表示上述表的連線匹配條件,即哪些列或常量被用於查詢索引列上的值,如果是使用的常數等值查詢,這裡會顯示const,如果是連線查詢,被驅動表的執行計畫這裡會顯示驅動表的關聯字段,如果是條件使用了表示式或者函式,或者條件列發生了內部隱式轉換,這裡可能顯示為func。
返回估算的結果集數目,注意這並不是乙個準確值。
extra的資訊非常豐富,常見的有如下4種型別:
idextra含義1
using index
使用覆蓋索引
2using where
使用了用where子句來過濾結果集
3using filesort
使用檔案排序,使用非索引列進行排序時出現,非常消耗效能,盡量優化
4using temporary
使用了臨時表
讀懂執行計畫:
會寫mysql索引:
mysql 查詢優化:
mysql優化:
讀懂MySQL執行計畫
原文 前言在之前的面試過程中,問到執行計畫,有很多童鞋不知道是什麼?甚至將執行計畫與執行時間認為是同乙個概念。今天我們就一起來了解一下執行計畫到底是什麼?有什麼用途?執行計畫是什麼?執行計畫,簡單的來說,是sql在資料庫中執行時的表現情況,通常用於sql效能分析,優化等場景。在mysql中使用 ex...
如何讀懂執行計畫
1 執行計畫概念 乙個執行計畫描述了一段sql語句建議的執行方法,該 計畫顯示oracle資料庫的執行sql時步驟的組合。每一步都得到資料庫中的物理資料行戒準備為他們的 使用者發布的宣告 2 生成執行計畫 使用語句生成 explain plan forselect from ods employe ...
mysql執行計畫 MySQL 執行計畫
1.執行計畫的定義 什麼是執行計畫 查詢計畫 呢?執行計畫就是一系列的操作步驟。sql是宣告性語言,它只告訴資料庫要查詢什麼,但並不告訴資料庫如何去查。資料庫所要做的就是基於演算法和統計資訊計算出一條最佳的訪問路徑。這個工作是由優化器來完成的。優化器會比較不同的執行計畫,然後選擇其中最優的一套。2....