1. explain文法
<code>explain select ...;</code>
執行計劃大緻包含以下資訊
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCM581dvRWYoNHLwEzX5xCMx8FesU2cfdGLwATMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xiNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLzIDO4gjNkBDM4MDZhZ2NxYzX4QjMwcTMxAzLcFTMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLzM3Lc9CX6MHc0RHaiojIsJye.png)
2. 常用屬性
1、如果id相同,那麼執行順序從上到下 2、如果id不同,值越大優先級越高,越先被執行 3、id相同和不同的都存在,相同的可以認為是一組,從上往下順序執行,在所有組中,id值越大,優先級越高,越先執行
select_type
說明
SIMPLE
簡單查詢,查詢中不包含子查詢或者UNION
PRIMARY
查詢中若包含任何複雜的子部分,最外層查詢則被标記為PRIMARY
SUBQUERY
在SELECT或WHERE清單中包含了子查詢,該子查詢被标記為SUBQUERY
DERIVED
在FROM清單中包含的子查詢被标記為DERIVED(衍生)
UNION
若第二個SELECT出現在UNION之後,則被标記為UNION。若UNION包含在 FROM子句的子查詢中,外層SELECT将被标記為DERIVED
UNION RESULT
從UNION表擷取結果的SELECT被标記為 UNION RESULT
對應行正在通路哪一個表,表名或者别名
type是通路類型,效率從最好到最壞依次是:const>ref>range>index>all。一般情況下,得保證查詢至少達到range級别,最好能達到ref
type
all
周遊全表以找到比對的行,一般情況下出現這樣的sql語句而且資料量比較大的話那麼就需要進行優化。
index
隻周遊索引樹。這個比all的效率要好
range
表示利用索引查詢的時候限制了範圍,在指定範圍内進行查詢,這樣避免了index的全索引掃描,适用的操作符: =, <>, >, >=, <, <=, IS NULL, BETWEEN, LIKE, or IN()
ref
非唯一性索引掃描,傳回比對某個單獨值的所有行
const
表示通過索引一次就找到了,const用于查找primary key 或者 unique索引。因為隻需比對一行資料,所有很快。
顯示可能在這張表中使用到的索引,一個或多個。
注意:是列出可能使用到的索引
在這張表中實際使用到的索引,如果為null,則沒有使用索引
執行查詢時,估算的找到所需的記錄需要讀取的行數
Extra
Using index
此值表示mysql将使用覆寫索引,以避免通路表。
Using filessort
表示使用檔案排序,說明order by 沒有走索引
Using temporary
對查詢結果排序時會使用臨時表
Using where
Using where的作用隻是提醒我們MySQL将用where子句來過濾結果集