開題概述
explain,數據庫提供的一種查看SQL執行計劃,並不實際執行SQL的關鍵字。不同的數據庫使用該關鍵字後查詢的結果並不一樣,本文以MySQL爲案例進行講解
案例
語法:explain sql語句(增刪改查SQL都可以)
常用於查詢SQL的性能排查,在添加explain關鍵字後執行的結果如下圖,示例SQL:
explain
select p.id,count(*) from danran_test_user_log l
inner join (select * from danran_test_user p where p.id > 1 and id < 2000) p on l.product_id = p.id
group by p.id;
從上圖可以看出:查詢danran_test_user表數據檢索可使率(結果的行數佔需讀取行數的百分比)很高,關於該表的查詢優化順序可以放到最後;danran_test_user_log表數據檢索可使率較低而且是全表掃描,說明該表查詢可能需要優化;
主題
我是如何得出以上結論的呢?
主要是查看explain返回的結果,接下來我們再看看具體每列的含義是什麼?首先,我們看下MySQL的官方文檔:
這裏簡單按照個人理解翻譯下常用幾個列
id
表示SQL執行順序,id相同時從上往下順序執行,id不同時值越大優先級別越高。
select_type
我們看下MySQL官網的說明 這裏簡單按照個人理解翻譯下常用幾個:
- SIMPLE: 簡單查詢,不包含子查詢和union這樣的複雜查詢,很常見的類型
- PRIMARY:包含子查詢SQL的主查詢,表示最外層,很常見的類型
- SUBQUERY:子查詢
- UNION**:union語句裏的SQL元素,union查詢。
table
表名稱,如果表有別名,則展示表別名
partitions
分區名稱
type
查詢時候的連接方式,下面按照從好到差順序依次介紹:
- null:無須使用索引,即可查到數據,如:
explain select 1;
- system:該表只有一行(=系統表)。這是const聯接類型的特例 。
- const:該表最多具有一個匹配行,該行在查詢開始時讀取。因爲只有一行,所以優化器的其餘部分可以將這一行中列的值視爲常量。 const表非常快,因爲它們只能讀取一次。常見案例就是根據主鍵查詢數據了
- eq_ref:一個表的主鍵或唯一索引與另一個表唯一索引或主鍵關聯查詢時會返回該類型。除了 system和 const類型,這是最好的聯接類型。
- ref:一個表與另一個表關聯查詢時會返回該類型。很常見的類型
- fulltext:使用FULLTEXT 索引執行聯接。MySQL5.6及之後Innodb也支持全文索引了,但是目前還存在BUG(已踩坑),不推薦使用哈
- range:在給定的範圍內檢索數據,很常見的類型
- ALL:全表掃描,儘量避免此種情況
possible_keys
可能使用的索引名稱
key
實際選擇的索引。這裏雖說是實際執行的索引,explain執行計劃可能與實際執行並不相同,取決於數據情況,MySQL優化器會根據具體數據情況選擇最終執行計劃
key_len
所選鍵的長度
ref
該ref列顯示將哪些列或常量與該key列中命名的索引進行比較,以 從表中選擇行。
rows
該rows列表示MySQL認爲執行查詢必須檢查的行數。對於InnoDB表,此數字是估計值,可能並不總是準確的。
filtered
該filtered列表示按表條件過濾的錶行的估計百分比。最大值爲100,這表示未過濾行。值從100減小表示過濾量增加。 rows顯示了檢查的估計行數,rows× filtered顯示了與下表連接的行數。例如,如果 rows爲1000且 filtered爲50.00(50%),則與下表連接的行數爲1000×50%= 500。
Extra
此列包含有關MySQL如何解析查詢的其他信息。有關不同值的說明,這裏就不具體概述了,詳情可以查看官方文檔