日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

MySQL Execution Plan--执行计划中的Type列

發布時間:2024/8/26 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL Execution Plan--执行计划中的Type列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在一次的優化過程中,由于沒有關注執行計劃中type列,僅看key列來查看"使用到的索引",導致優化過程走了不少彎路。

以下面SQL為例:

SELECT wave_no, SUM(IF(picking_qty IS NULL, 0, picking_qty)) AS PICKED_QTY, SUM(IF(differ_qty IS NULL, 0, differ_qty)) AS PICKED_DIFFER_QTY, SUM(IF(relocate_qty IS NULL, 0, relocate_qty)) AS PICKED_RELOCATE_QTY FROM picking_locate_d WHERE yn = 0 AND wave_no IN ( 'BC76361213164811', 'BC76361213164810', ... 'BC76361213158692' ) AND org_No = '661' AND distribute_No = '763' AND warehouse_No = '612' GROUP BY wave_no;

走索引查找的執行計劃為:

+----+-------------+------------------+------------+-------+---------------+-------------+---------+------+-------+----------+------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+------------------+------------+-------+---------------+-------------+---------+------+-------+----------+------------------------------------+ | 1 | SIMPLE | picking_locate_d | NULL | range | idx_wave_no | idx_wave_no | 153 | NULL | 14238 | 0.01 | Using index condition; Using where | +----+-------------+------------------+------------+-------+---------------+-------------+---------+------+-------+----------+------------------------------------+

?走索引掃描執行計劃為:

+----+-------------+------------------+------------+-------+---------------+-------------+---------+------+----------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+------------------+------------+-------+---------------+-------------+---------+------+----------+----------+-------------+ | 1 | SIMPLE | picking_locate_d | NULL | index | idx_wave_no | idx_wave_no | 153 | NULL | 37660147 | 0.01 | Using where | +----+-------------+------------------+------------+-------+---------------+-------------+---------+------+----------+----------+-------------+

?

上面兩個執行計劃都使用索引idx_wave_no,但:

第一個執行計劃影響行數為14238,與IN查詢中的值數量相同,其執行計劃type列值為range,表示index range scan。

第二個執行計劃影響行數為37660147,與整表數據量相同,其執行計劃type列為index,表示index scan。

?

哪為啥索引查找是index range scan呢?通過MySQL trace工具查看,其中輸出包含以下信息:

"chosen_range_access_summary": { "range_access_plan": {"type": "range_scan","index": "idx_wave_no","rows": 5,"ranges": ["BC76361213164810 <= wave_no <= BC76361213164810","BC76361213164811 <= wave_no <= BC76361213164811","BC76361213158692 <= wave_no <= BC76361213158692"] /* ranges */ } /* range_access_plan */, "rows_for_plan": 5, "cost_for_plan": 9.01, "chosen": true } /* chosen_range_access_summary */

其中查詢中WHERE子句:

wave_no IN ( 'BC76361213164811', 'BC76361213164810', 'BC76361213158692' )

由于idx_wave_no為非唯一索引,雖然是等值查詢,仍需要從第一個等于指定值的索引記錄開始掃描,直到第一個不等于指定值的索引記錄,因為被稱為范圍掃描(Range Scan) :

"ranges": ["BC76361213164810 <= wave_no <= BC76361213164810","BC76361213164811 <= wave_no <= BC76361213164811","BC76361213158692 <= wave_no <= BC76361213158692"]

IN子句中的3個值被轉換為3次INDEX RANGE SCAN。

?

對于全索引掃描(INDEX SCAN),通過MySQL trace工具查看,其中輸出包含以下信息:

"considered_execution_plans": [{"plan_prefix": [] /* plan_prefix */,"table": "`picking_locate_d`","best_access_path": {"considered_access_paths": [{"rows_to_scan": 37660147,"access_type": "scan","resulting_rows": 3.77e7,"cost": 9.58e6,"chosen": true,"use_tmp_table": true}] /* considered_access_paths */} /* best_access_path */,"condition_filtering_pct": 100,"rows_for_plan": 3.77e7,"cost_for_plan": 9.58e6,"sort_cost": 3.77e7,"new_cost_for_plan": 4.72e7,"chosen": true} ] /* considered_execution_plans */

其中access_type=scan表明操作為INDEX SCAN,rows_to_scan=37660147表名掃描整個索引上37660147行記錄。

?

通過DESC或EXPLAIN輸出的執行計劃中,Type列的可選值分別對應:

all: 全表掃描 index: 索引全掃描 range: 索引范圍掃描,常用語<,<=,>=,between等操作 ref: 使用非唯一索引掃描或唯一索引前綴掃描,返回單條記錄,常出現在關聯查詢中 eq_ref: 類似ref,區別在于使用的是唯一索引,使用主鍵的關聯查詢 const/system: 單條記錄,系統會把匹配行中的其他列作為常數處理,如主鍵或唯一索引查詢 null: MySQL不訪問任何表或索引,直接返回結果

?

轉載于:https://www.cnblogs.com/gaogao67/p/10771113.html

總結

以上是生活随笔為你收集整理的MySQL Execution Plan--执行计划中的Type列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。