使用 explain 如何判斷二級索引使用后是否回表?

使用 explain 如何判斷二級索引使用后是否回表?

如何使用 explain 判斷二級索引使用后,是否存在回表操作?

對于給定的查詢 sql

select     track_source_id,     date_format(created_at, '%y-%m-%d') as day,     count(*) as total_count,     sum(case when len_parse_result_list = 0 then 1 else 0 end) as len_parse_result_list_zero_count,     sum(case when len_parse_result_list is null then 1 else 0 end) as len_parse_result_list_null_count,     sum(case when len_parse_result_list > 0 then 1 else 0 end) as len_parse_result_list_gte_zero_count from     keywordtask where     created_at >= now() - interval 30 day group by     track_source_id,     day order by     track_source_id,     day;

其 explain 輸出:

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | | --- | ----------- | ----- | ---------- | ---- | ------------- | --- | ------ | --- | ---- | -------- | ----- | | 1   | SIMPLE      | keywordtask | NULL      | index | idx_created_at,idx_track_source_id_created_at_len_parse_result_list | idx_track_source_id_created_at_len_parse_result_list | 14 | NULL | 134324154 | 50.0 | using where; Using index; Using temporary; Using filesort |

是否回表判斷:

通過讀取 extra 列,可以判斷查詢是否回表:

  • using index 表示索引覆蓋,不需要回表。
  • using index condition 表示索引查找,不需要回表過濾。
  • using index & using where 表示索引查找,但需要回表過濾。
  • using where 表示回表查詢數據。
  • 主鍵查詢 不回表,但 extra 列無法反映。

對于給定的查詢,extra 列為 using where; using index; using temporary; using filesort,表明查詢使用了索引 (idx_track_source_id_created_at_len_parse_result_list),但需要回表過濾條件 created_at >= now() – interval 30 day。因此,該查詢會發生回表操作。

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享