explain執(zhí)行計劃重要參數(shù)有id,type,key,rows,extra
1.id 表示執(zhí)行的順序,id越大越先執(zhí)行,id一樣時從上往下執(zhí)行。
2.select_type 表示查詢類型,通常有:
? ? simple:表示不需要union操作或者不包含子查詢的簡單查詢。
? ? primary:表示最外層查詢。
? ? union:union操作中第二個及之后的查詢。
? ? dependent union:union操作中第二個及之后的查詢,并且該查詢依賴于外部查詢。
? ? subquery:子查詢中的第一個查詢。
? ? dependent subquery:子查詢中的第一個查詢,并且該查詢依賴于外部查詢。
? ? derived:派生表查詢,既from字句中的子查詢。
? ? materialized:物化查詢。
? ? uncacheable subquery:無法被緩存的子查詢,對外部查詢的每一行都需要重新進(jìn)行查詢。
? ? uncacheable union:union操作中第二個及之后的查詢,并且該查詢屬于uncacheable subquery。
3.table 表名或者表的別名。
4.partitions 分區(qū)信息,非分區(qū)表為null。
5.type 訪問類型,表示找到所查詢數(shù)據(jù)的方法,也是本文重點(diǎn)介紹的屬性。該屬性的常見值如下,性能從好到差:
? ? NULL:無需訪問表或者索引,比如獲取一個索引列的最大值或最小值。
? ? system/const:當(dāng)查詢最多匹配一行時,常出現(xiàn)于where條件是=的情況。system是const的一種特殊情況,既表本身只有一行數(shù)據(jù)的情況。
? ? eq_ref:多表關(guān)聯(lián)查詢時,根據(jù)唯一非空索引進(jìn)行查詢的情況。
? ? ref:多表查詢時,根據(jù)非唯一非空索引進(jìn)行查詢的情況。
? ? range:在一個索引上進(jìn)行范圍查找。
? ? index:遍歷索引樹查詢,通常發(fā)生在查詢結(jié)果只包含索引字段時。
? ? ALL:全表掃描,沒有任何索引可以使用時。這是最差的情況,應(yīng)該避免。
6.possible_keys 表示mysql此次查詢中可能使用的索引。
7.key 表示mysql實(shí)際在此次查詢中使用的索引。
8.key_len 表示mysql最大可能的索引的長度(是根據(jù)字段類型的長度計算出的)。該值越小越好。
9.ref 表示連接查詢的連接條件。
10.rows 表示mysql估計此次查詢大致所需讀取掃描的行數(shù)。該值越小越好。
11.extra 表示mysql解決查詢的其他信息,有幾十種不同的值,該信息也是我們優(yōu)化sql可以專注的一個值
using filesort:說明mysql會對數(shù)據(jù)使用一個外部的索引排序,而不是按照表內(nèi)的索引順序進(jìn)行讀取的,mysql中對于這種無法利用索引完成的排序操作成為"文件排序",是在內(nèi)存中使用快排的方式完成的,并不是真正的磁盤中排序
using temporary:使用了臨時表保存中間結(jié)果,mysql在對查詢結(jié)果排序時使用臨時表,常見于order by和分組查詢group by
using index:標(biāo)識相應(yīng)的select操作中使用了覆蓋索引,其實(shí)會掃描整顆B+樹的,只是避免了直接訪問表的數(shù)據(jù)行,其效率視數(shù)據(jù)行數(shù)而定的.如果同時出現(xiàn)了using where,表明索引被用來執(zhí)行索引鍵值的查找,如果沒有同時出現(xiàn)using where,表明索引引用來讀取數(shù)據(jù)而非執(zhí)行查找
using where:表明使用了where過濾
using join buffer:表明使用了連接緩存,查詢中有多次join,可能會產(chǎn)生臨時表
執(zhí)行完explain之后可以執(zhí)行show warnings命令可以看到mysql給出的建議
where條件前面force index語法可以強(qiáng)制sql語句走指定的索引
比較耗時的定時任務(wù)的事務(wù)應(yīng)該放到低峰時期去做,因?yàn)殚L事務(wù)操作的數(shù)據(jù)量大的情況會比較耗費(fèi)io.這個時候執(zhí)行其他操作會大打折扣,因?yàn)闆]有多少io來給其他操作了
有一個sql調(diào)優(yōu)的工具叫做profiling,是mysql自帶的.show variables like 'profiling'能找到
可以通過set profiling = 1;開啟.慢sql會被存在slow_query_log_file中 show variables like '%slow%'可以找到相關(guān)配置