mysql執行計劃初步解讀2
阿新 • • 發佈:2019-02-28
百分比 相關 裏的 oss 計劃 不生效 創建索引 基於 滿足 繼續上次沒有寫完的執行計劃部分
6.possible_keys可能使用到的索引,這個的理解呢, 表示查詢時可能使用的索引。只是可能用到,但是並不一定用到。如果是空的,表明肯定是沒有相關的索引。但是如果有值,也不一定能夠用到。
7.key實際使用的索引。
6,7的話一起來看下面的例子: 如果是條件使用了表達式或者函數,或者條件列發生了內部隱式轉換,這裏可能顯示為func
如果沒有用索引的話,這裏會顯示NULL
6.possible_keys可能使用到的索引,這個的理解呢, 表示查詢時可能使用的索引。只是可能用到,但是並不一定用到。如果是空的,表明肯定是沒有相關的索引。但是如果有值,也不一定能夠用到。
7.key實際使用的索引。
6,7的話一起來看下面的例子:
mysql> explain select * from `order` where seller_id = 19; +----+-------------+-------+------------+------+------------------+------+---------+------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+------------------+------+---------+------+------+----------+-------------+ | 1 | SIMPLE | order | NULL | ALL | 商家,seller_id | NULL | NULL | NULL | 2197 | 100.00 | Using where | +----+-------------+-------+------------+------+------------------+------+---------+------+------+----------+-------------+ 1 row in set, 1 warning (0.00 sec) mysql> explain select * from `order` where customer_id = 55029; +----+-------------+-------+------------+------+---------------+-------------+---------+-------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+-------------+---------+-------+------+----------+-------+ | 1 | SIMPLE | order | NULL | ref | customer_id | customer_id | 8 | const | 10 | 100.00 | NULL | +----+-------------+-------+------------+------+---------------+-------------+---------+-------+------+----------+-------+ 1 row in set, 1 warning (0.00 sec)
對於第一條sql,這裏的possible_keys的結果為有可能走seller_id上的索引,但是實際的key為NULL。之前也說過了,因為只有一個賣家,雖然有索引,但是Innodb選擇了全表掃描,這是基於CBO進行選擇的結果。我們現在刪除一下seller_id上的索引看看是怎麽樣的。
mysql> explain select * from `order` where seller_id = 19; +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+ | 1 | SIMPLE | order | NULL | ALL | 商家 | NULL | NULL | NULL | 2197 | 100.00 | Using where | +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+ 1 row in set, 1 warning (0.00 sec)
可見已經走的是全表掃表了。
第二條sql這裏的possible_keys的結果為seller_id,實際上也是走的seller_id,說明索引生效了。
8.key_len 使用到索引字段的長度
註意:key_len是通過定義得到的,表示索引字段的最大可能長度,並非實際使用長度。
曾經踩過一個坑,因為創建索引的時候,並沒有主動定義索引長度,結果長度為20的字段索引長度只有4。然後索引不生效導致數據庫雪崩。所以平時最好養成一個定義索引時記得加長度的習慣。
9.ref顯示哪個字段或常數與key一起被使用
如果是使用的常數等值查詢,這裏會顯示const
如果是連接查詢,被驅動表的執行計劃這裏會顯示驅動表的關聯字段
如果沒有用索引的話,這裏會顯示NULL
10.row掃描行數
這個數表示mysql要遍歷多少數據才能找到,是根據統計得來的,可能並不是十分精準
11.filtered過濾百分比
針對條件的記錄數的百分比所做的一個估算(這裏是一個悲觀估算,即最大值),即mysql將要過濾行數的百分比。
12.Extra額外信息
Using index:表示覆蓋索引,只查詢索引值就滿足sql的要求了。
mysql> explain select customer_id from `order` where customer_id = 55029;
+----+-------------+-------+------------+------+---------------+-------------+---------+-------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+-------------+---------+-------+------+----------+-------------+
| 1 | SIMPLE | order | NULL | ref | customer_id | customer_id | 8 | const | 10 | 100.00 | Using index |
+----+-------------+-------+------------+------+---------------+-------------+---------+-------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
Using where:表示條件查詢,即單純索引不能夠滿足所有需求列了。
暫時先寫一下這些簡單的理解吧,如有不對之處,請指正。
mysql執行計劃初步解讀2