v7.5.x执行计划选错索引

【TiDB 使用环境】生产环境
【TiDB 版本】v7.5.6
【遇到的问题:问题现象及影响】
在v5.3.3版本运行没问题的SQL,升级至v7.5.6后变成慢查询。通过执行计划查看,发现走错索引。
表结构索引

PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
  KEY `idx_refund_no` (`refund_no`),
  KEY `idx_sub_order_no` (`sub_order_no`),
  KEY `idx_order_no` (`order_no`),
  KEY `idx_buyer_id_create_time` (`buyer_id`,`create_time`),
  KEY `idx_seller_id_create_time` (`seller_id`,`create_time`)
  KEY `idx_seller_id_modify_time` (`seller_id`,`modify_time`) 
  KEY `idx_create_time` (`create_time`) 
  KEY `idx_buyer_name_create_time` (`buyer_name`,`create_time`) 
  KEY `idx_refund_type_create_time` (`refund_type`,`create_time`),
  KEY `idx_modify_time` (`modify_time`)

SQL语句

SELECT
  `id`,
  refund_no,
  order_no,
  sub_order_no,
  biz_type,
  biz_channel,
  biz_code,
  biz_id,
  buyer_id,
  buyer_name,
  seller_id,
  seller_name,
  refund_type,
  refund_status,
  refund_reason_code,
  refund_reason,
  sku_id,
  sku_title,
  sku_price,
  sku_count,
  item_info,
  buyer_note,
  feature,
  is_del,
  create_time,
  modify_time,
  refund_close_type,
  refund_close_time,
  trade_close_type,
  refund_money_status,
  seller_type,
  operator_id,
  operator_type,
  buyer_del,
  seller_del,
  buyer_pic_urls,
  exchange_type,
  return_back_address,
  version,
  feature_version,
  route_type,
  exchange_status
FROM
  refund_order
WHERE
  sub_order_no = '110181745965242788'
  AND refund_type IN (
    20,
    50
  )
  AND create_time BETWEEN '2025-09-09 00:00:00.0'
  AND '2025-09-16 23:59:59.999'
  AND exchange_type IN (0)
  AND is_del = 0
ORDER BY
  create_time DESC
LIMIT
  0, 20;

v5.3.3版本explain analyze执行计划
SQL执行耗时0.01秒

+----------------------------------+---------+---------+-----------+----------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+------+
| id                               | estRows | actRows | task      | access object                                            | execution info                                                                                                                                                                                                                                                                                                                                                                           | operator info                                                                                                                                                                                                                                                                                                                                             | memory  | disk |
+----------------------------------+---------+---------+-----------+----------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+------+
| TopN_9                           | 0.00    | 1       | root      |                                                          | time:2.6ms, loops:2                                                                                                                                                                                                                                                                                                                                                                      | dw_trade_refund_seller_db.refund_order.create_time:desc, offset:0, count:20                                                                                                                                                                                                                                                                               | 20.9 KB | N/A  |
| └─IndexLookUp_24                 | 0.00    | 1       | root      |                                                          | time:2.54ms, loops:3, index_task: {total_time: 894µs, fetch_handle: 890.2µs, build: 776ns, wait: 2.97µs}, table_task: {total_time: 1.53ms, num: 1, concurrency: 5}                                                                                                                                                                                                                       |                                                                                                                                                                                                                                                                                                                                                           | 21.1 KB | N/A  |
|   ├─IndexRangeScan_17(Build)     | 1.20    | 1       | cop[tikv] | table:refund_order, index:idx_sub_order_no(sub_order_no) | time:888.9µs, loops:3, cop_task: {num: 1, max: 806.7µs, proc_keys: 1, rpc_num: 1, rpc_time: 792.7µs, copr_cache_hit_ratio: 0.00}, tikv_task:{time:0s, loops:1}, scan_detail: {total_process_keys: 1, total_process_keys_size: 73, total_keys: 2, rocksdb: {delete_skipped_count: 0, key_skipped_count: 1, block: {cache_hit_count: 11, read_count: 1, read_byte: 63.9 KB}}}              | range:["110181745965242788","110181745965242788"], keep order:false                                                                                                                                                                                                                                                                                       | N/A     | N/A  |
|   └─TopN_23(Probe)               | 0.00    | 1       | cop[tikv] |                                                          | time:1.4ms, loops:2, cop_task: {num: 1, max: 1.3ms, proc_keys: 1, tot_proc: 1ms, rpc_num: 1, rpc_time: 1.29ms, copr_cache_hit_ratio: 0.00}, tikv_task:{time:1ms, loops:1}, scan_detail: {total_process_keys: 1, total_process_keys_size: 3201, total_keys: 1, rocksdb: {delete_skipped_count: 0, key_skipped_count: 0, block: {cache_hit_count: 14, read_count: 0, read_byte: 0 Bytes}}} | dw_trade_refund_seller_db.refund_order.create_time:desc, offset:0, count:20                                                                                                                                                                                                                                                                               | N/A     | N/A  |
|     └─Selection_19               | 0.00    | 1       | cop[tikv] |                                                          | tikv_task:{time:1ms, loops:1}                                                                                                                                                                                                                                                                                                                                                            | eq(dw_trade_refund_seller_db.refund_order.exchange_type, 0), eq(dw_trade_refund_seller_db.refund_order.is_del, 0), ge(dw_trade_refund_seller_db.refund_order.create_time, 2025-09-09 00:00:00.000000), in(dw_trade_refund_seller_db.refund_order.refund_type, 20, 50), le(dw_trade_refund_seller_db.refund_order.create_time, 2025-09-16 23:59:59.999000) | N/A     | N/A  |
|       └─TableRowIDScan_18        | 1.20    | 1       | cop[tikv] | table:refund_order                                       | tikv_task:{time:1ms, loops:1}                                                                                                                                                                                                                                                                                                                                                            | keep order:false                                                                                                                                                                                                                                                                                                                                          | N/A     | N/A  |
+----------------------------------+---------+---------+-----------+----------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+------+
6 rows in set (0.01 sec)

v7.5.6版本explain analyze执行计划
SQL执行耗时5秒+

+------------------------------------+---------+---------+-----------+--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+------+
| id                                 | estRows | actRows | task      | access object                                          | execution info                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | operator info                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | memory  | disk |
+------------------------------------+---------+---------+-----------+--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+------+
| Projection_7                       | 0.00    | 1       | root      |                                                        | time:3.03s, loops:2, RU:163348.904775, Concurrency:OFF                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | dw_trade_refund_seller_db.refund_order.id, dw_trade_refund_seller_db.refund_order.refund_no, dw_trade_refund_seller_db.refund_order.order_no, dw_trade_refund_seller_db.refund_order.sub_order_no, dw_trade_refund_seller_db.refund_order.biz_type, dw_trade_refund_seller_db.refund_order.biz_channel, dw_trade_refund_seller_db.refund_order.biz_code, dw_trade_refund_seller_db.refund_order.biz_id, dw_trade_refund_seller_db.refund_order.buyer_id, dw_trade_refund_seller_db.refund_order.buyer_name, dw_trade_refund_seller_db.refund_order.seller_id, dw_trade_refund_seller_db.refund_order.seller_name, dw_trade_refund_seller_db.refund_order.refund_type, dw_trade_refund_seller_db.refund_order.refund_status, dw_trade_refund_seller_db.refund_order.refund_reason_code, dw_trade_refund_seller_db.refund_order.refund_reason, dw_trade_refund_seller_db.refund_order.sku_id, dw_trade_refund_seller_db.refund_order.sku_title, dw_trade_refund_seller_db.refund_order.sku_price, dw_trade_refund_seller_db.refund_order.sku_count, dw_trade_refund_seller_db.refund_order.item_info, dw_trade_refund_seller_db.refund_order.buyer_note, dw_trade_refund_seller_db.refund_order.feature, dw_trade_refund_seller_db.refund_order.is_del, dw_trade_refund_seller_db.refund_order.create_time, dw_trade_refund_seller_db.refund_order.modify_time, dw_trade_refund_seller_db.refund_order.refund_close_type, dw_trade_refund_seller_db.refund_order.refund_close_time, dw_trade_refund_seller_db.refund_order.trade_close_type, dw_trade_refund_seller_db.refund_order.refund_money_status, dw_trade_refund_seller_db.refund_order.seller_type, dw_trade_refund_seller_db.refund_order.operator_id, dw_trade_refund_seller_db.refund_order.operator_type, dw_trade_refund_seller_db.refund_order.buyer_del, dw_trade_refund_seller_db.refund_order.seller_del | 18.2 KB | N/A  |
| └─Limit_12                         | 0.00    | 1       | root      |                                                        | time:3.03s, loops:2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | offset:0, count:20                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | N/A     | N/A  |
|   └─IndexLookUp_28                 | 0.00    | 1       | root      |                                                        | time:3.03s, loops:2, index_task: {total_time: 3s, fetch_handle: 575.2ms, build: 407.6ms, wait: 2.02s}, table_task: {total_time: 13s, num: 213, concurrency: 5}, next: {wait_index: 412.9ms, wait_table_lookup_build: 1.75ms, wait_table_lookup_resp: 2.62s}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | 27.9 MB | N/A  |
|     ├─IndexRangeScan_25(Build)     | 3.94    | 4072848 | cop[tikv] | table:refund_order, index:idx_create_time(create_time) | time:417.2ms, loops:1029, cop_task: {num: 5, max: 710.1ms, min: 315.7µs, avg: 316.1ms, p95: 710.1ms, max_proc_keys: 960001, p95_proc_keys: 960001, tot_proc: 1.46s, tot_wait: 115.8µs, copr_cache_hit_ratio: 0.40, build_task_duration: 24.6µs, max_distsql_concurrency: 2}, rpc_info:{Cop:{num_rpc:5, total_time:1.58s}}, tikv_task:{proc max:844ms, min:276ms, avg: 528ms, p80:844ms, p95:844ms, iters:4000, tasks:5}, scan_detail: {total_process_keys: 2617892, total_process_keys_size: 120423032, total_keys: 2617895, get_snapshot_time: 45.5µs, rocksdb: {delete_skipped_count: 543, key_skipped_count: 2618978, block: {cache_hit_count: 3423}}}                                                                                                         | range:[2025-09-09 00:00:00,2025-09-17 00:00:00), keep order:true, desc                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | N/A     | N/A  |
|     └─Selection_27(Probe)          | 0.00    | 1       | cop[tikv] |                                                        | time:12.1s, loops:214, cop_task: {num: 1025, max: 169.9ms, min: 0s, avg: 29.1ms, p95: 72.6ms, max_proc_keys: 12447, p95_proc_keys: 9842, tot_proc: 24.2s, tot_wait: 317.8ms, copr_cache_hit_ratio: 0.00, build_task_duration: 3.6ms, max_distsql_concurrency: 8, max_extra_concurrency: 1, store_batch_num: 1}, rpc_info:{Cop:{num_rpc:1024, total_time:29.8s}}, tikv_task:{proc max:156ms, min:0s, avg: 27.2ms, p80:44.5ms, p95:70ms, iters:8300, tasks:1025}, scan_detail: {total_process_keys: 4070555, total_process_keys_size: 9993006843, total_keys: 5926447, get_snapshot_time: 38.8ms, rocksdb: {delete_skipped_count: 1419272, key_skipped_count: 12927252, block: {cache_hit_count: 684752, read_count: 3366, read_byte: 29.3 MB, read_time: 86.8ms}}} | eq(dw_trade_refund_seller_db.refund_order.exchange_type, 0), eq(dw_trade_refund_seller_db.refund_order.is_del, 0), eq(dw_trade_refund_seller_db.refund_order.sub_order_no, "110181745965242788"), in(dw_trade_refund_seller_db.refund_order.refund_type, 20, 50)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | N/A     | N/A  |
|       └─TableRowIDScan_26          | 3.94    | 4072848 | cop[tikv] | table:refund_order                                     | tikv_task:{proc max:155ms, min:0s, avg: 26.7ms, p80:44ms, p95:69.3ms, iters:8300, tasks:1025}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | keep order:false                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | N/A     | N/A  |
+------------------------------------+---------+---------+-----------+--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+------+
6 rows in set (3.04 sec)
1 个赞

给个 plan replayer 我看看。

analyze table 搞下表的健康度。。

你的where条件比较多。建议搞一个多字段的联合索引。

1 个赞

索引维护了挺多,如果走的索引不合适,就在执行时强制选择指定的索引

统计信息看下准吗

查看 idx_sub_order_no 的统计信息先呢

可以尝试下:
(1)重新统计分析库表后再试;
(2)再次分析执行计划,如果走的索引不对,尝试下Hint;
(3)观察加入Hint的执行计划并执行验证。

hint影响一下试试,然后重新收集一下统计数据

  • 紧急场景优先使用 FORCE INDEX 强制指定索引,快速恢复业务;
  • 非紧急场景核心操作是 ANALYZE TABLE 更新统计信息,这是解决索引选错的根本非侵入式方案;
  • 长期优化需聚焦于清理无用索引、优化 SQL 避免隐式转换、适配新版本优化器行为,减少后续类似问题发生。

虽然 idx_sub_order_no 是单列索引,但如果能创建一个包含查询条件和排序字段的覆盖索引 ,性能会更好,甚至不需要回表。

试下这个 KEY idx_sub_order_no_opt (sub_order_no, refund_type, exchange_type, is_del, create_time)

可以尝试下覆盖索引

1 个赞

对,回复中的索引调整和hint都可以有效的影响一下执行计划,可以看看试试

优化器错误地认为扫描create_time的范围(7天)比sub_order_no的等值查询更优

对,这样不用再回表查字段,效率高

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。