1.id
一個(gè)sql中有多少個(gè)select就有多少個(gè)id滥比,id值越大執(zhí)行優(yōu)先級(jí)越高亚脆,id相同則從上往下執(zhí)行,id為NULL最后執(zhí)行盲泛。
2.select_type列
- simple 簡(jiǎn)單查詢濒持。查詢不包含子查詢和union
- primary 復(fù)雜查詢中最外層的 select
- subquery 包含在 select 中的子查詢(不在 from 子句中)
- derived 包含在 from 子句中的子查詢。MySQL會(huì)將結(jié)果存放在一個(gè)臨時(shí)表中寺滚,也稱為派生表
- union 在 union 中的第二個(gè)和隨后的 select
3.table列
表示 explain 的一行正在訪問(wèn)哪個(gè)表柑营。derivenN:子查詢使用的那個(gè)表,union1,2:表示union參與的select 行id村视。
4.type列
這一列表示關(guān)聯(lián)類型或訪問(wèn)類型官套。
最優(yōu)到最差分別為:system > const > eq_ref > ref > range > index > ALL,一般來(lái)說(shuō)蚁孔,得保證查詢達(dá)到range級(jí)別奶赔,最好達(dá)到ref。當(dāng)這一列為null勒虾,原因是mysql能夠在優(yōu)化階段分解查詢語(yǔ)句纺阔,在執(zhí)行階段用不著再訪問(wèn)表或索引。
const,system: 用于primary key 或 unique key 的所有列與常數(shù)比較時(shí)修然,所以表最多有一個(gè)匹配行笛钝,讀取1次质况,速度比較快。system是const的特例玻靡,表里只有一條元組匹配時(shí)為system结榄。
eq_ref: primary key 或 unique key 索引的所有部分被連接使用 ,最多只會(huì)返回一條符合條件的記錄囤捻。
ref: 相比 eq_ref臼朗,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前綴蝎土,索引要和某個(gè)值相比較视哑,可能會(huì)找到多個(gè)符合條件的行。
range: 范圍掃描通常出現(xiàn)在 in(), between ,> ,<, >= 等操作中誊涯。使用一個(gè)索引來(lái)檢索給定范圍的行挡毅。
index: 掃描全索引就能拿到結(jié)果,一般是掃描某個(gè)二級(jí)索引暴构,這種掃描不會(huì)從索引樹(shù)根節(jié)點(diǎn)開(kāi)始快速查找跪呈,而是直接
對(duì)二級(jí)索引的葉子節(jié)點(diǎn)遍歷和掃描,速度還是比較慢的取逾,這種查詢一般為使用覆蓋索引耗绿,二級(jí)索引一般比較小,所以這種通常比ALL快一些砾隅。
ALL: 即全表掃描误阻,掃描你的聚簇索引的所有葉子節(jié)點(diǎn)。通常情況下這需要增加索引來(lái)進(jìn)行優(yōu)化了琉用。
5.possible_keys列
explain 時(shí)可能出現(xiàn) possible_keys 有列堕绩,而 key 顯示 NULL 的情況,這種情況是因?yàn)楸碇袛?shù)據(jù)不多邑时,mysql認(rèn)為索引對(duì)此查詢幫助不大,選擇了全表查詢特姐。
6.key列
這一列顯示mysql實(shí)際采用哪個(gè)索引來(lái)優(yōu)化對(duì)該表的訪問(wèn)晶丘。
7. key_len列
這一列顯示了mysql在索引里使用的字節(jié)數(shù),通過(guò)這個(gè)值可以算出具體使用了索引中的哪些列唐含。
char(n):如果存漢字長(zhǎng)度就是 3n 字節(jié)
varchar(n):如果存漢字則長(zhǎng)度是 3n + 2 字節(jié)浅浮,加的2字節(jié)用來(lái)存儲(chǔ)字符串長(zhǎng)度,因?yàn)?br> varchar是變長(zhǎng)字符串
tinyint:1字節(jié)
smallint:2字節(jié)
int:4字節(jié)
bigint:8字節(jié)
date:3字節(jié)
timestamp:4字節(jié)
datetime:8字節(jié)
如果字段允許為 NULL捷枯,需要1字節(jié)記錄是否為 NULL
8. ref列
這一列顯示了在key列記錄的索引中滚秩,表查找值所用到的列或常量,常見(jiàn)的有:const(常量)
9. rows列
這一列是mysql估計(jì)要讀取并檢測(cè)的行數(shù)淮捆,注意這個(gè)不是結(jié)果集里的行數(shù)郁油。
10. Extra列
Using index:使用覆蓋索引
Using where:使用 where 語(yǔ)句來(lái)處理結(jié)果本股,并且查詢的列未被索引覆蓋
Using index condition:查詢的列不完全被索引覆蓋,where條件中是一個(gè)前導(dǎo)列的范圍桐腌;
Using temporary:mysql需要?jiǎng)?chuàng)建一張臨時(shí)表來(lái)處理查詢拄显。出現(xiàn)這種情況一般是要進(jìn)行優(yōu)化的,首先是想到用索
引來(lái)優(yōu)化案站。
Using filesort:將用外部排序而不是索引排序躬审,數(shù)據(jù)較小時(shí)從內(nèi)存排序,否則需要在磁盤(pán)完成排序蟆盐。這種情況下一般也是要考慮使用索引來(lái)優(yōu)化的承边。
Select tables optimized away:使用某些聚合函數(shù)(比如 max、min)來(lái)訪問(wèn)存在索引的某個(gè)字段時(shí)石挂,這種查詢只會(huì)走索引樹(shù)博助。