schedual定時任務執行報錯 explain執行計劃詳解( 五 )

9. index
需要掃描全部的索引記錄時,該表的訪問方法就是 index,成本很高 。舉例:
mysql> EXPLAIN SELECT key_part1 FROM s1 WHERE key_part3 = 'a'; ---- ------------- ------- ------------ ------- --------------- -------------- --------- ------ ------ ---------- -------------------------- | id | select_type | table | partitions | type| possible_keys | key| key_len | ref| rows | filtered | Extra| ---- ------------- ------- ------------ ------- --------------- -------------- --------- ------ ------ ---------- -------------------------- |1 | SIMPLE| s1| NULL| index | NULL| idx_key_part | 909| NULL | 9688 |10.00 | Using where; Using index | ---- ------------- ------- ------------ ------- --------------- -------------- --------- ------ ------ ---------- -------------------------- possible_keys 和 key在 EXPLAIN 語句輸出的執行計劃中,possible_keys 列表示在某個查詢語句中,對某個表執行單表查詢時可能用到的索引有哪些,key 列表示實際用到的索引有哪些 。
有些時候使用到的索引未必在 passible_keys 中,上面 type 為 index 的示例中,passible_keys 顯示為 NULL,但實際 key 顯示是使用到索引的 。possible_keys 列中的值并不是越多越好,可能使用的索引越多,查詢優化器計算查詢成本時就得花費更長時間,所以如果可以的話,盡量刪除那些用不到的索引 。
key_lenkey_len 列顯示 MySQL 決定使用的鍵長度 。如果鍵是 NULL,則長度為 NULL 。使用的索引的長度 。在不損失精確性的情況下,長度越短越好。
ref當使用索引列等值匹配的條件去執行查詢時,也就是在訪問方法是 const、eq_ref、ref、ref_or_null、unique_subquery、index_subquery 其中之一時,ref 列展示的就是與索引列作等值匹配的對象是啥 。如果不是等值查詢,則顯示為 NULL 。
比如單表查詢時肯定是個常數 const:
mysql> explain select * from t1 where a=100; ---- ------------- ------- ------------ ------ --------------- ------ --------- ------- ------ ---------- ------- | id | select_type | table | partitions | type | possible_keys | key| key_len | ref| rows | filtered | Extra | ---- ------------- ------- ------------ ------ --------------- ------ --------- ------- ------ ---------- ------- |1 | SIMPLE| t1| NULL| ref| a| a| 5| const |1 |100.00 | NULL| ---- ------------- ------- ------------ ------ --------------- ------ --------- ------- ------ ---------- ------- 而關聯查詢中則是驅動表的關聯字段 t2.a:
mysql> explain select * from t1 join t2 on t1.a=t2.a where t1.a<50;---- ------------- ------- ------------ ------- --------------- ------ --------- ----------- ------ ---------- ----------------------- | id | select_type | table | partitions | type| possible_keys | key| key_len | ref| rows | filtered | Extra| ---- ------------- ------- ------------ ------- --------------- ------ --------- ----------- ------ ---------- ----------------------- |1 | SIMPLE| t2| NULL| range | a| a| 5| NULL|1 |100.00 | Using index condition ||1 | SIMPLE| t1| NULL| ref| a| a| 5| hucq.t2.a |1 |100.00 | NULL| ---- ------------- ------- ------------ ------- --------------- ------ --------- ----------- ------ ---------- ----------------------- rows如果查詢優化器決定使用全表掃描的方式對某個表執行查詢時,執行計劃的 rows 列就代表預計需要掃描的行數;如果使用索引來執行查詢時,執行計劃的 rows 列就代表預計掃描的索引記錄行數 。
這有可能是個精確值,也可能是個估算值,計算方法有 index dive 和基于統計索引信息的估算 。
filtered對于單表查詢來說: