一文讀懂 MySQL 索引( 四 )

explain 使用也很簡單 , 直接在查詢語句前面加上 explain 關鍵字即可:
EXPLAIN SELECT * FROM user where id = 1;

一文讀懂 MySQL 索引

文章插圖
從圖中我們看到 MySQL 返回了一行記錄 , 下面我們一起來分析每個字段代表什么含義
字段含義id一次查詢過程中該條 select 語句的唯一標識select_type查詢類型,共包含四種 simple、primary、subquery、derivedtable查詢的是哪張表partitions表的分區信息type訪問類型,分析性能主要通過該字段possible_keys可能會用到的索引key實際用到的索引key_len索引里使用的字節數ref這一列顯示了在key列記錄的索引中,表查找值所用到的列或常量rowsMySQL 預估的掃描行filteredMySQL 過濾后,滿足條件記錄數的比例Extra展示了一些額外信息5.2.2 Explain 詳解1、id
id 是查詢語句中的唯一標識,id 的值越大,該 id 對應的 sql 語句越先執行
explain select * from dept where id = (select dept_id from user where id = 1);
一文讀懂 MySQL 索引

文章插圖
從執行計劃來看 , select dept_id from user where id = 1 這條語句先執行,因為外層查詢需要借助這條查詢語句的結果
2、select_type
查詢類型,共包含四種
simple:簡單查詢 。查詢不包含子查詢和union
一文讀懂 MySQL 索引

文章插圖
primary:復雜查詢中最外層的 select
一文讀懂 MySQL 索引

文章插圖
subquery:包含在 select 中的子查詢(不在 from 子句中)
一文讀懂 MySQL 索引

文章插圖
derived:包含在 from 子句中的子查詢 。MySQL會將結果存放在一個臨時表中,也稱為派生表(derived的英文含義)
3、table
查詢的是哪張表,比較好理解
4、partitions
查詢時匹配到的分區信息,對于非分區表值為 NULL,當查詢的是分區表時 , partitions 顯示分區表命中的分區情況 。
5、type
type:查詢使用了何種類型 , 它在 SQL優化中是一個非常重要的指標,以下性能從好到壞依次是:system> const > eq_ref > ref> ref_or_null > range > index > ALL
  • system 是 const 的特例,也就是當表中只存在一條記錄時 , type 為 system
  • const,常量查詢,id 是主鍵,通過 id 可以查詢到所有信息
    一文讀懂 MySQL 索引

    文章插圖
  • eq_ref , 連接查詢中,primary key 或 unique key 索引的所有部分被連接使用
注意:這里 dept 的 id 和 user 的 id 并無關聯關系,只是為了演示該查詢類型
一文讀懂 MySQL 索引

文章插圖
user 的 id 和 dept 的 id 都是主鍵,在連接查詢中,兩個主鍵都被使用到
  • ref,不使用唯一索引,使用普通索引或者唯一索引,可能會找到多個條件的值,idx_name 是普通索引

一文讀懂 MySQL 索引

文章插圖
  • ref_of_null,和 ref 功能類似,區別在于會額外搜索索引包含 NULL 的值,name 字段是普通索引,且數據庫中存在 name 為 null 的數據

一文讀懂 MySQL 索引

文章插圖
  • range , 在索引字段上使用范圍查詢 , 常見的有 >、<、in、like 等查詢

一文讀懂 MySQL 索引

文章插圖
  • index , 通過索引樹進行全表掃描

一文讀懂 MySQL 索引

文章插圖
  • ALL,全表掃描,不通過索引樹,因為這次是 select * 查詢

一文讀懂 MySQL 索引

文章插圖
6、possible_keys
MySQL 分析此次查詢可能會用到的索引,但是實際查詢中不一定會用到
一文讀懂 MySQL 索引

文章插圖
分析可能會用到 idx_name 這個索引,實際查詢中沒有用到索引,走的全表掃描
7、key
查詢時真正用到的 key
一文讀懂 MySQL 索引

文章插圖
查詢中實際上用到了 idx_name 這個索引
8、ken_len
表示查詢用到的索引列長度

推薦閱讀