爛sql不僅直接影響sql的響應時間,更影響db的效能,導致其它正常的sql響應時間變長。如何寫好sql,學會看執行計畫至關重要。下面我簡單講講mysql的執行計畫,只列出了一些常見的情況,希望對大家有所幫助。
測試表結構:
create table `t1` (
`c1` int(11) not null default '0',
`c2` varchar(128) default null,
`c3` varchar(64) default null,
`c4` int(11) default null,
primary key (`c1`),
key `ind_c2` (`c2`),
key `ind_c4` (`c4`)
) engine=innodb default charset=utf8
create table `t2` (
`c1` int(11) not null default '0',
`c2` varchar(128) default null,
`c3` varchar(64) default null,
`c4` int(11) default null,
primary key (`c1`),
key `ind_c2` (`c2`)
) engine=innodb default charset=utf8
create table `t3` (
`c1` int(11) not null default '0',
`c2` varchar(128) default null,
`c3` varchar(64) default null,
`c4` int(11) default null,
primary key (`c1`),
key `ind_c2` (`c2`)
) engine=innodb default charset=utf8
1.檢視mysql執行計畫
explain select ......
2.執行計畫包含的資訊
(1).id
含義,指示select字句或操作表的順序。
eg1:id相同,執行順序從上到下,下面的執行計畫表示,先操作t1表,然後操作t2表,最後操作t3表。
eg2:若存在子查詢,則子查詢(內層查詢)id大於父查詢(外層查詢),先執行子查詢。id越大,優先順序越高。
含義:select語句的型別
型別:a.******:查詢中不包含子查詢或者union
b.查詢中若包含任何複雜的子部分,最外層查詢則被標記為:primary
c.在select或where列表中包含了子查詢,該子查詢被標記為:subquery
d.在from列表中包含的子查詢被標記為:derived(衍生)
e.若第二個select出現在union之後,則被標記為union;若union包含在 from子句的子查詢中,
外層select將被標記為:derived
f.從union表獲取結果的select被標記為:union result
id為1的table顯示,表示結果**於衍生表2。
id為2表示子查詢,讀取t3表
id為3型別為union,是union的第二個select,最先執行;
id為null的型別為union result, 表示id為1的操作和id為3的操作進行結果集合並。
執行順序3->2->1->null
(3).type
含義:獲取記錄行採用的方式,亦即mysql的訪問方式。
a.all:full table scan, mysql將遍歷全表以找到匹配的行
b.index:full index scan,index與all區別為index型別只遍歷索引,索引一般比記錄要小。
因為索引中含有c1,查詢c1,c2可以通過索引掃瞄實現。
c.range:索引範圍掃瞄,對索引的掃瞄開始於某一點,返回匹配值域的行,常見於between、等的查詢
備註:range型別肯定是使用了索引掃瞄,否則type為all
d.ref:非唯一性索引掃瞄,返回匹配某個單獨值的所有行。常見於使用非唯一索引即唯一索引的非唯一字首進行的查詢
t2.c4為非唯一索引
e.eq_ref:唯一性索引掃瞄,對於每個索引鍵,表中只有一條記錄與之匹配。常見於主鍵或唯一索引掃瞄
t2.c1為主鍵索引,主鍵索引也是唯一索引
f.const、system:當mysql對查詢某部分進行優化,並轉換為乙個常量時,使用這些型別訪問。如將主鍵置於where列表中,
mysql就能將該查詢轉換為乙個常量,system是const型別的特例,當查詢的表只有一行的情況下, 使用system
含義:指出mysql能使用哪個索引在表中找到行,查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢使用
(5).key
含義:顯示mysql在查詢中實際使用的索引,若沒有使用索引,顯示為null
(6)key_len
含義:表示索引中使用的位元組數,可通過該列計算查詢中使用的索引的長度
(7)ref
含義:用於連線查詢,表示具體某個表的某列被引用
(8)rows
(9)extra
含義:顯示一些輔助的額外資訊
a.using index,表示使用了索引
b.using where,表示通過where條件過濾
c.using temporary,表示使用了臨時表,常見於分組和排序
d.using filesort,表示無法使用索引排序,需要檔案排序
eg1:t1.c3列沒有索引
eg2:使用索引列t1.c2
mysql索引執行計畫 MySQL索引及執行計畫
mysql索引及執行計畫 索引合理的建立索引可以加快資料查詢,例如,學校圖書管為每一本書編號,根據編號可以快速鎖定一本書所在位置。mysql索引預設b 樹索引。索引雖然能夠提高檢索效率,但同時也會降低更新的速度,因為insert update delete也會操作索引檔案,會調整因為更新等操作帶來的...
mysql執行計畫 MySQL 執行計畫
1.執行計畫的定義 什麼是執行計畫 查詢計畫 呢?執行計畫就是一系列的操作步驟。sql是宣告性語言,它只告訴資料庫要查詢什麼,但並不告訴資料庫如何去查。資料庫所要做的就是基於演算法和統計資訊計算出一條最佳的訪問路徑。這個工作是由優化器來完成的。優化器會比較不同的執行計畫,然後選擇其中最優的一套。2....
mysql 生成執行計畫 MySQL執行計畫
和很多其他關係型資料庫不通,mysql並不會在生成查詢位元組碼來執行查詢。mysql生成查詢的一棵指令樹,然後通過儲存引擎執行完成這棵指令樹並返回結果。最終的執行計畫包含了重構查詢的全部資訊。如果某個查詢執行explain extended 之後,在執行show warnings,就可以看到重構出的...