好程序員
Java
學習路線之
MySQL
的執行計劃。什么是執行計劃?
執行計劃通常是開發者優化
SQL
語句的第一步。
MySQL
在解析
SQL
語句時,會生成多套執行方案,然后內部會進行一個成本的計算,然后通過優化器選擇一個最優的方案執行,然后根據這個方案會生成一個執行計劃。開發者通過查看
SQL
語句的執行計劃,可以直觀的了解到
MySQL
是如何解析執行這條
SQL
語句的,然后再針對性的進行優化。
如何查看
SQL
語句的執行計劃?
語法:
explain ?select
語句
;
執行計劃每個字段的含義:
id
(重要)
:主要用來標識
SQL
語句的解析執行順序
id
相同的情況:
id
不同的情況:
id
相同不同同時存在:
id
為
null
的情況:
比較少見,
id
為
null
的部分一定是最后執行的
select_type:主要用來標識當前查詢的類型
mysql
查詢的分類:
簡單查詢:沒有子查詢以及
union
的
sql
復雜查詢:
where
和
select
后面有子查詢
from
后面有子查詢
包換
union
關鍵字
SIMPLE
:標識當前查詢是一個簡單查詢
PRIMARY
:如果是一個復雜查詢(子查詢或者
union
),則最外層的
SQL
語句會被標記成這個類型
SUBQUERY
:用來標記一個子查詢(
where
、
select
)
注意:通常來說被標記成
PRIMARY
的部分,是最后執行的部分
DERIVED
:用來標記一個衍生查詢(
from
后面的子查詢)
UNION
:標記
union
關鍵字后面的查詢部分
UNION RESULT
:標記
union
結果的合并部分
type(
重要
)
:用來標識當前這條
SQL
語句是用哪種方式訪問的數據行(最差
->
最優)
all
:表示當前
MySQL
是采用全表掃描的方式訪問的數據行
index
:表示當前是按照全索引掃描的方式訪問所有數據行
range
:表示查詢了索引的某個范圍
ref
:表示查詢了索引的某個值,但是這個值是可能重復的(只會出現在非唯一性索引的字段上)
eq_ref
:表示查詢了索引的某個值,但是這個值是唯一的(只會出現在主鍵、唯一性索引上,并且需要結合連接查詢)
const
:查詢索引的某個唯一性值,
mysql
會將這個條件優化成一個常量
system
(正式開發基本不會出現):表示
mysql
可以確定查詢的表結果一定只有一條
null
(性能最好,但是作用不大):表示當前
SQL
語句直接在解析時就能獲得結果,不能去查詢記錄行
注意:通常在實際開發過程中,需要將
SQL
語句優化到
range
以上的級別,但是一定要具體問題具體分析,有些時候
all
反而是更好的行為。
possible_keys
:用來標記當前這條
SQL
語句可能用上的索引列表
key
(重要)
:用來標識當前這個
SQL
語句用上了哪個索引
注意:有可能一個索引出現在
possible_keys
中,但是沒有出現在
key
中;也有可能一個索引出現在
key
中,但是沒有出現在
possible_keys
中。
explain select * from student force index(idx_age) order by age;
標識手動設置
MySQL
執行的索引,但是最好不要這么干
key_len:標識當前使用到的索引長度,這個值越大,說明越多的條件使用上了索引
rows(
重要
)
:表示當前查詢可能訪問的記錄行數,這個值越小越好,最好顯示
1
注意:通常在實際的優化過程中,需要參考
type
和
rows
兩個字段來決定是否需要進行優化。
比如
type
為
all
,但是
rows
為
1
,這種情況下,其實完全無需優化。
比如
type
為
ref,
但是
rows
為
10W
,那么這條
sql
語句性能肯定比不上
all - 1
Extra(
重要
)
:表示當前一些額外的信息顯示的地方
Using index
:說明當前的執行計劃用上了覆蓋索引。
Using temporary
:說明當前內部使用了臨時表
(
分組、排序
)
Using filesort
:說明使用了文件排序,這個排序有可能在內存上排序,也有可能在硬盤上排序,如果是在硬盤上排序,則最好優化一下(比如通過索引進行排序)
Using where
:表示使用了過濾條件