explain
- id :select查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序
- select_type:查詢類型 或者是 其他操作類型
- table :正在訪問哪個表
- partitions :匹配的分區
- type :訪問的類型,評價sql性能的一個指標
- possible_keys :顯示可能應用在這張表中的索引,一個或多個,但不一定實際使用到
- key :實際使用到的索引,如果為NULL,則沒有使用索引
- key_len :表示索引中使用的字節數,可通過該列計算查詢中使用的索引的長度
- ref :顯示索引的哪一列被使用了,如果可能的話,是一個常數,哪些列或常量被用于查找索引列上的值
- rows :根據表統計信息及索引選用情況,大致估算出找到所需的記錄所需讀取的行數
- filtered :表示符合查詢條件的數據占全部數據的百分比
- Extra :包含不適合在其它列中顯示但十分重要的額外信息
select_type
- SIMPLE: 簡單查詢,不包含子查詢或UNION。
- PRIMARY: 主查詢,包含子查詢時最外層的查詢。
- SUBQUERY: 子查詢,出現在SELECT或WHERE中的獨立子查詢。
- DEPENDENT SUBQUERY: 相關子查詢,結果依賴于外部查詢的列。
- UNCACHEABLE SUBQUERY: 無法緩存的子查詢(如含隨機函數或變量)。
- UNION: UNION操作中第二個或后續的SELECT語句。
- UNION RESULT: UNION操作的結果集。
- DERIVED: 派生表(子查詢在FROM子句中)。
- MATERIALIZED: 物化子查詢,結果被存儲為臨時表供后續使用。
type單表訪問方法
連接類型,有如下幾種取值,性能從好到壞排序 如下:
-
null:MySQL能夠在優化階段分解查詢語句,在執行階段用不著再訪問表或索引,如select 1;
-
system:該表只有一行(相當于系統表),system是const類型的特例
-
const:“常數”,針對主鍵或唯一索引的等值查詢掃描, 最多只返回一行數據。 const 查詢速度非常快, 因為它僅僅讀取一次即可
-
eq_ref:當使用了索引的全部組成部分,并且索引是PRIMARY KEY或UNIQUE NOT NULL 才會使用該類型,性能僅次于system及const。
-
ref:搜索條件為二 級索引列與常數進行得值比較,形成的掃描區為單點掃描區間 采用二級索引來執行查詢"的訪問方法稱為 ref。
-
fulltext:全文索引
-
ref_or_null:該類型類似于ref,但是MySQL會額外搜索哪些行包含了NULL。這種類型常見于解析子查詢
-
index_merge:此類型表示使用了索引合并優化,表示一個查詢里面用到了多個索引
-
unique_subquery:該類型和eq_ref類似,但是使用了IN查詢,且子查詢是主鍵或者唯一索引。
-
range:
?
SELECT * FROM single_table WHERE key2 IN (1438, 6328) OR (key2 >= 38 AND key2 <= 79);
? 如果使用 idx_key2 執行該查詢,那么對應的掃描區間就是 [1438, 1438]、[6328, 6328] 以及 [38, 79]。設計 MySQL 的大叔把“使用索引執行查詢時,對應的掃描區間為若干個單點掃描區間或者范圍掃描區間”的訪問方法稱為 range(僅包含一個單點掃描區間的訪問方法不能稱為 range 訪問方法,掃描區間為 (?∞,+∞) 的訪問方法也不能稱為 range 訪問方法)。
? 范圍掃描,表示檢索了指定范圍的行,主要用于有限制的索引掃描。比較常見的范圍掃描是帶有BETWEEN子句或WHERE子句里有>、>=、<、<=、IS NULL、<=>、BETWEEN、LIKE、IN()等操作符。
-
index:全索引掃描,和ALL類似,只不過index是全盤掃描了索引的數據。當查詢僅使用索引中的一部分列時,可使用此類型。有兩種場景會觸發:
- 如果索引是查詢的覆蓋索引,并且索引查詢的數據就可以滿足查詢中所需的所有數據,則只掃描索引樹。此時,explain的Extra 列的結果是Using index。index通常比ALL快,因為索引的大小通常小于表數據。
- 按索引的順序來查找數據行,執行了全表掃描。此時,explain的Extra列的結果不會出現Uses index。
-
ALL:全表掃描,性能最差。直接掃描主鍵索引葉子節點文件
extra
展示有關本次查詢的附加信息,取值如下:
-
Using filesort:當Query 中包含 ORDER BY 操作,而且無法利用索引完成排序操作的時候,MySQL Query Optimizer 不得不選擇相應的排序算法來實現。數據較少時從內存排序,否則從磁盤排序。Using tempporary:在對MySQL查詢結果進行排序時,使用了臨時表,這樣的查詢效率是比外部排序更低的,常見于order by和group by。
-
Using index:使用了索引覆蓋
-
Using where:使用了where進行過濾,即使用到了索引,如果沒有索引,說明是去聚集索引全盤掃描,說明沒用到where進行過濾,只用where進行判斷
-
Using index condition:使用了索引下推
-
Using MRR:使用了Multi-Range Read優化
-
Using join buffer:使用了連接緩存,比如說在查詢的時候,多表join的次數非常多,那么將配置文件中的緩沖區的join buffer調大一些
-
Distinct:查找distinct值,當找到第一個匹配的行后,就不再搜索了
-
id :select查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序
-
select_type:查詢類型 或者是 其他操作類型
-
table :正在訪問哪個表
-
partitions :匹配的分區
-
type :訪問的類型,評價sql性能的一個指標
-
possible_keys :顯示可能應用在這張表中的索引,一個或多個,但不一定實際使用到
-
key :實際使用到的索引,如果為NULL,則沒有使用索引
-
key_len :表示索引中使用的字節數,可通過該列計算查詢中使用的索引的長度
-
ref :顯示索引的哪一列被使用了,如果可能的話,是一個常數,哪些列或常量被用于查找索引列上的值
-
rows :根據表統計信息及索引選用情況,大致估算出找到所需的記錄所需讀取的行數
-
filtered :表示符合查詢條件的數據占全部數據的百分比
-
Extra :包含不適合在其它列中顯示但十分重要的額外信息
select_type
- SIMPLE: 簡單查詢,不包含子查詢或UNION。
- PRIMARY: 主查詢,包含子查詢時最外層的查詢。
- SUBQUERY: 子查詢,出現在SELECT或WHERE中的獨立子查詢。
- DEPENDENT SUBQUERY: 相關子查詢,結果依賴于外部查詢的列。
- UNCACHEABLE SUBQUERY: 無法緩存的子查詢(如含隨機函數或變量)。
- UNION: UNION操作中第二個或后續的SELECT語句。
- UNION RESULT: UNION操作的結果集。
- DERIVED: 派生表(子查詢在FROM子句中)。
- MATERIALIZED: 物化子查詢,結果被存儲為臨時表供后續使用。
type單表訪問方法
連接類型,有如下幾種取值,性能從好到壞排序 如下:
-
null:MySQL能夠在優化階段分解查詢語句,在執行階段用不著再訪問表或索引,如select 1;
-
system:該表只有一行(相當于系統表),system是const類型的特例
-
const:“常數”,針對主鍵或唯一索引的等值查詢掃描, 最多只返回一行數據。 const 查詢速度非常快, 因為它僅僅讀取一次即可
-
eq_ref:當使用了索引的全部組成部分,并且索引是PRIMARY KEY或UNIQUE NOT NULL 才會使用該類型,性能僅次于system及const。
-
ref:搜索條件為二 級索引列與常數進行得值比較,形成的掃描區為單點掃描區間 采用二級索引來執行查詢"的訪問方法稱為 ref。
-
fulltext:全文索引
-
ref_or_null:該類型類似于ref,但是MySQL會額外搜索哪些行包含了NULL。這種類型常見于解析子查詢
-
index_merge:此類型表示使用了索引合并優化,表示一個查詢里面用到了多個索引
-
unique_subquery:該類型和eq_ref類似,但是使用了IN查詢,且子查詢是主鍵或者唯一索引。
-
range:
?
SELECT * FROM single_table WHERE key2 IN (1438, 6328) OR (key2 >= 38 AND key2 <= 79);
? 如果使用 idx_key2 執行該查詢,那么對應的掃描區間就是 [1438, 1438]、[6328, 6328] 以及 [38, 79]。設計 MySQL 的大叔把“使用索引執行查詢時,對應的掃描區間為若干個單點掃描區間或者范圍掃描區間”的訪問方法稱為 range(僅包含一個單點掃描區間的訪問方法不能稱為 range 訪問方法,掃描區間為 (?∞,+∞) 的訪問方法也不能稱為 range 訪問方法)。
? 范圍掃描,表示檢索了指定范圍的行,主要用于有限制的索引掃描。比較常見的范圍掃描是帶有BETWEEN子句或WHERE子句里有>、>=、<、<=、IS NULL、<=>、BETWEEN、LIKE、IN()等操作符。
-
index:全索引掃描,和ALL類似,只不過index是全盤掃描了索引的數據。當查詢僅使用索引中的一部分列時,可使用此類型。有兩種場景會觸發:
- 如果索引是查詢的覆蓋索引,并且索引查詢的數據就可以滿足查詢中所需的所有數據,則只掃描索引樹。此時,explain的Extra 列的結果是Using index。index通常比ALL快,因為索引的大小通常小于表數據。
- 按索引的順序來查找數據行,執行了全表掃描。此時,explain的Extra列的結果不會出現Uses index。
-
ALL:全表掃描,性能最差。直接掃描主鍵索引葉子節點文件
extra
展示有關本次查詢的附加信息,取值如下:
-
Using filesort:當Query 中包含 ORDER BY 操作,而且無法利用索引完成排序操作的時候,MySQL Query Optimizer 不得不選擇相應的排序算法來實現。數據較少時從內存排序,否則從磁盤排序。Using tempporary:在對MySQL查詢結果進行排序時,使用了臨時表,這樣的查詢效率是比外部排序更低的,常見于order by和group by。
-
Using index:使用了索引覆蓋
-
Using where:使用了where進行過濾,即使用到了索引,如果沒有索引,說明是去聚集索引全盤掃描,說明沒用到where進行過濾,只用where進行判斷
-
Using index condition:使用了索引下推
-
Using MRR:使用了Multi-Range Read優化
-
Using join buffer:使用了連接緩存,比如說在查詢的時候,多表join的次數非常多,那么將配置文件中的緩沖區的join buffer調大一些
-
Distinct:查找distinct值,當找到第一個匹配的行后,就不再搜索了
-
id :select查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序
-
select_type:查詢類型 或者是 其他操作類型
-
table :正在訪問哪個表
-
partitions :匹配的分區
-
type :訪問的類型,評價sql性能的一個指標
-
possible_keys :顯示可能應用在這張表中的索引,一個或多個,但不一定實際使用到
-
key :實際使用到的索引,如果為NULL,則沒有使用索引
-
key_len :表示索引中使用的字節數,可通過該列計算查詢中使用的索引的長度
-
ref :顯示索引的哪一列被使用了,如果可能的話,是一個常數,哪些列或常量被用于查找索引列上的值
-
rows :根據表統計信息及索引選用情況,大致估算出找到所需的記錄所需讀取的行數
-
filtered :表示符合查詢條件的數據占全部數據的百分比
-
Extra :包含不適合在其它列中顯示但十分重要的額外信息
select_type
- SIMPLE: 簡單查詢,不包含子查詢或UNION。
- PRIMARY: 主查詢,包含子查詢時最外層的查詢。
- SUBQUERY: 子查詢,出現在SELECT或WHERE中的獨立子查詢。
- DEPENDENT SUBQUERY: 相關子查詢,結果依賴于外部查詢的列。
- UNCACHEABLE SUBQUERY: 無法緩存的子查詢(如含隨機函數或變量)。
- UNION: UNION操作中第二個或后續的SELECT語句。
- UNION RESULT: UNION操作的結果集。
- DERIVED: 派生表(子查詢在FROM子句中)。
- MATERIALIZED: 物化子查詢,結果被存儲為臨時表供后續使用。
type單表訪問方法
連接類型,有如下幾種取值,性能從好到壞排序 如下:
-
null:MySQL能夠在優化階段分解查詢語句,在執行階段用不著再訪問表或索引,如select 1;
-
system:該表只有一行(相當于系統表),system是const類型的特例
-
const:“常數”,針對主鍵或唯一索引的等值查詢掃描, 最多只返回一行數據。 const 查詢速度非常快, 因為它僅僅讀取一次即可
-
eq_ref:當使用了索引的全部組成部分,并且索引是PRIMARY KEY或UNIQUE NOT NULL 才會使用該類型,性能僅次于system及const。
-
ref:搜索條件為二 級索引列與常數進行得值比較,形成的掃描區為單點掃描區間 采用二級索引來執行查詢"的訪問方法稱為 ref。
-
fulltext:全文索引
-
ref_or_null:該類型類似于ref,但是MySQL會額外搜索哪些行包含了NULL。這種類型常見于解析子查詢
-
index_merge:此類型表示使用了索引合并優化,表示一個查詢里面用到了多個索引
-
unique_subquery:該類型和eq_ref類似,但是使用了IN查詢,且子查詢是主鍵或者唯一索引。
-
range:
?
SELECT * FROM single_table WHERE key2 IN (1438, 6328) OR (key2 >= 38 AND key2 <= 79);
? 如果使用 idx_key2 執行該查詢,那么對應的掃描區間就是 [1438, 1438]、[6328, 6328] 以及 [38, 79]。設計 MySQL 的大叔把“使用索引執行查詢時,對應的掃描區間為若干個單點掃描區間或者范圍掃描區間”的訪問方法稱為 range(僅包含一個單點掃描區間的訪問方法不能稱為 range 訪問方法,掃描區間為 (?∞,+∞) 的訪問方法也不能稱為 range 訪問方法)。
? 范圍掃描,表示檢索了指定范圍的行,主要用于有限制的索引掃描。比較常見的范圍掃描是帶有BETWEEN子句或WHERE子句里有>、>=、<、<=、IS NULL、<=>、BETWEEN、LIKE、IN()等操作符。
-
index:全索引掃描,和ALL類似,只不過index是全盤掃描了索引的數據。當查詢僅使用索引中的一部分列時,可使用此類型。有兩種場景會觸發:
- 如果索引是查詢的覆蓋索引,并且索引查詢的數據就可以滿足查詢中所需的所有數據,則只掃描索引樹。此時,explain的Extra 列的結果是Using index。index通常比ALL快,因為索引的大小通常小于表數據。
- 按索引的順序來查找數據行,執行了全表掃描。此時,explain的Extra列的結果不會出現Uses index。
-
ALL:全表掃描,性能最差。直接掃描主鍵索引葉子節點文件
extra
展示有關本次查詢的附加信息,取值如下:
- Using filesort:當Query 中包含 ORDER BY 操作,而且無法利用索引完成排序操作的時候,MySQL Query Optimizer 不得不選擇相應的排序算法來實現。數據較少時從內存排序,否則從磁盤排序。Using tempporary:在對MySQL查詢結果進行排序時,使用了臨時表,這樣的查詢效率是比外部排序更低的,常見于order by和group by。
- Using index:使用了索引覆蓋
- Using where:使用了where進行過濾,即使用到了索引,如果沒有索引,說明是去聚集索引全盤掃描,說明沒用到where進行過濾,只用where進行判斷
- Using index condition:使用了索引下推
- Using MRR:使用了Multi-Range Read優化
- Using join buffer:使用了連接緩存,比如說在查詢的時候,多表join的次數非常多,那么將配置文件中的緩沖區的join buffer調大一些
- Distinct:查找distinct值,當找到第一個匹配的行后,就不再搜索了