MySQL Explain 執(zhí)行計(jì)劃詳解、寫高效SQL、靈活使用索引(實(shí)戰(zhàn))
2023-02-15 14:41 作者:仲夏七月夢(mèng) | 我要投稿

- MySQL的Explain執(zhí)行計(jì)劃屬性:
- id:數(shù)值表示select語句的執(zhí)行順序,大的先執(zhí)行
- select_type
- simple:無子查詢和join關(guān)鍵字
- primary:復(fù)雜查詢最外層語句或union最左的select
- subquery:僅限于from前面的select語句
- derived:可包含from后面的查詢,且將中間結(jié)果存放到臨時(shí)表中
- union
- table 表名
- type列(執(zhí)行效率依次遞減)
- null:解析SQL時(shí)就能完成,不需要查找表或索引
- system
- const:where id = 1這種
- eq_ref:主鍵索引或唯一索引與其他字段的關(guān)聯(lián)查詢,最多只返回一條記錄,on xx.id = xxx.id
- ref:普通索引
- range:范圍查詢,where id>3這種
- index:按所有索引查找
- all:沒有索引因此需要全表查詢
- possible_keys:可能使用到的索引,需要視key而定。若possible_key列有值但key為null,則說明該索引對(duì)本次查詢無效,進(jìn)而進(jìn)行全表掃描;如果都為null,則表示沒有相關(guān)索引,可以視情況創(chuàng)建索引。
- key
- key_len:適用于聯(lián)合索引時(shí)確定哪些索引生效
- ref
- rows:預(yù)估要讀取的行數(shù),不是結(jié)果集的行數(shù)
- extra
- using index:判斷該字段是否添加索引,有則覆蓋偽索引
- using where:where后面沒用到索引,可考慮添加索引
- using index condition:前導(dǎo)列。where id =1 and id>3
- using temporary:生成了需要被優(yōu)化的中間表
- using filesort:數(shù)據(jù)沒通過索引排序,若量小則排在內(nèi)存中,否則放到磁盤中去排序
- select table optimized:直接從表信息就可以獲得結(jié)果,不必查表和走索引。舉例:type字段里屬性為null的情況
標(biāo)簽: