0
0
0
0
博客/.../

TiKV MVCC 内存引擎 In-Memory Engine 实现数据多版本场景性能优化

 pepezzzz  发表于  2025-12-16

业务场景

TiDB v7.5.6 版本集群,业务 SQL SELECT * FROM `job_queue` AS `t` 会出现较长的执行时间,同时高并发的执行会对 tikv 造成较大的压力。该表在业务流程中用于接口记录的持久化,使用方式类似队列,job_queue 表内持续插入新的任务记录,等任务流程完成后,删除表内对应的任务记录,每日共会记录约几十万任务记录。执行计划中可以看出 actRows 和total_process_keys 都是 32,但是 total_keys 有 420609,比例相差悬殊,说明多版本数据量比例非常大。


| id                  | estRows | estCost  | actRows | task      | access object | execution info                                                                                                                                                                                                                                       | operator info                                                                                                                                                                                           | memory  | disk  |
| Projection_3        | 182.00  | 10143.49 | 32      | root      |               | time:785.5ms, loops:2, Concurrency:OFF                                                                                                                                                                                                               | 列名脱敏                                                                                                                                                                                                  | 26.1 KB | N/A   |
| └─TableReader_5     | 182.00  | 10034.51 | 32      | root      |               | time:785.4ms, loops:2, cop_task: {num: 1, max: 785.2ms, proc_keys: 32, tot_proc: 168.7ms, tot_wait: 440.8µs, copr_cache_hit_ratio: 0.00, build_task_duration: 8.47µs, max_distsql_concurrency: 1}, rpc_info:{Cop:{num_rpc:1, total_time:785.2ms}}    | data:TableFullScan_4                                                                                                                                                                                    | 2.08 KB | N/A   |
|   └─TableFullScan_4 | 182.00  | 52499.67 | 32      | cop[tikv] | table:t       | tikv_task:{time:780ms, loops:2}, scan_detail: {total_process_keys: 32, total_process_keys_size: 2372, total_keys: 420609, get_snapshot_time: 21.6µs, rocksdb: {delete_skipped_count: 181, key_skipped_count: 420789, block: {cache_hit_count: 740}}} | keep order:false, stats:pseudo                                                                                                                                                                          | N/A     | N/A   |

性能不佳的原因

TiDB 的 MVCC 多版本数据存储实现机制,在 Key 上会标识数据版本。

-- TiDB 数据存储结构示例

Key: table_id{row_id}_timestamp

Value: column_data + transaction_info

-- 实际存储格式:

-- Key: t{123}_r1_v5 (table 123, row 1, version 5)

-- Value: {name: "John", age: 25, start_ts: 5, commit_ts: 10}

集群通过 gc_life_time 配置所有历史数据版本的保留周期,TiDB 的后台 Compaction 机制再定期清理过期旧版本数据。在本项目的场景中,数据记录被删除时,也仅是增加一份删除标识的版本,所以全表扫描时会访问所有在 GC 时间(生产上配置为 26 小时)内的MVCC 多版本数据,相当于访问当前的有效数据和已经删除的无效版本数据(过去 26 小时内的所有记录数据),导致访问压力过大。

做为对比, MySQL 是基于 InnoDB 的 undo log 实现 MVCC,原数据位置只保留新版本的数据,原版本迁移到 UNDO 区,通过版本链接到 UNDO 区,所以 MySQL 上不会出现全表查询时需要访问到过期数据的行为。

升级到 8.5.3 版本启用 IME 功能

TiKV MVCC 内存引擎 (In-Memory Engine, IME) 主要用于加速需要扫描大量 MVCC 历史版本的查询,即查询扫描的总共版本数量 (total_keys) 远大于处理的版本数量 (processed_keys)。内存引擎加速扫描了大量 MVCC 版本的读请求。

TiKV MVCC 内存引擎适用于以下场景:

  • 业务需要查询频繁更新或删除的记录。
  • 业务需要调整 tidb_gc_life_time,使 TiDB 保留较长时间的历史版本(比如 24 小时)。

开启内存引擎之后,TiKV 会根据 Region 的读流量和 MVCC 放大程度,选择要自动加载的 Region。具体流程如下:

  1. Region 按照最近时间段的 next (RocksDB Iterator next API) 和 prev (RocksDB Iterator prev API) 次数进行排序。
  2. 使用 mvcc-amplification-threshold 配置项对 Region 进行过滤,该配置项的默认值为 10。MVCC amplification 衡量读放大程度,计算公式为 (next + prev) / processed_keys)。
  3. 载入前 N 个 MVCC 放大严重的 Region,其中 N 基于内存估算而来。

从机制说明上可以看出,IME 特性不仅适用于单行记录不断被 update 的多版本的场景,如热销商品的库存扣减等,还适用于 Region 内有效 keys 数据非常少的场景,类似本例中表内数据不断被删除但是需要全表查询的队列场景。

IME 本地模拟测试

测试过程

进程一:模拟循环写入和删除过程

   for i in {1..100}
   do
     $dbcmd 2>/dev/null -e "insert into db1.t1(c2,c3,c4) select c2+FLOOR(1 + RAND() * 10000),c3,c4 from db1.tt;";
   done
   echo "Job $nm insert data complete."
   $dbcmd 2>/dev/null -e "delete from db1.t1;"
   echo "Job $nm clear data complete."

进程二:模拟查询过程

TiKV 启用 IME 的查询计划

MySQL [db1]> explain analyze select * from t1;
+-----------------------+-----------+---------+-----------+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| id                    | estRows   | actRows | task      | access object | execution info                                                                                                                                                                                                                                                                                                                                                                                    | operator info        | memory   | disk |
+-----------------------+-----------+---------+-----------+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| TableReader_5         | 183864.00 | 9200    | root      |               | time:90.1ms, loops:11, RU:40.843020, cop_task: {num: 11, max: 76ms, min: 608.5µs, avg: 8.81ms, p95: 76ms, max_proc_keys: 3040, p95_proc_keys: 3040, tot_proc: 80ms, tot_wait: 924µs, copr_cache_hit_ratio: 0.45, build_task_duration: 31.4µs, max_distsql_concurrency: 6}, rpc_info:{Cop:{num_rpc:11, total_time:96.6ms}}                                                                         | data:TableFullScan_4 | 278.9 KB | N/A  |
| └─TableFullScan_4     | 183864.00 | 9200    | cop[tikv] | table:t1      | tikv_task:{proc max:872ms, min:0s, avg: 354.9ms, p80:830ms, p95:872ms, iters:37, tasks:11}, scan_detail: {total_process_keys: 9200, total_process_keys_size: 587260, total_keys: 477434, get_snapshot_time: 280.8µs, rocksdb: {block: {}}}, time_detail: {total_process_time: 80ms, total_suspend_time: 24.5µs, total_wait_time: 924µs, total_kv_read_wall_time: 79ms, tikv_wall_time: 83.7ms}    | keep order:false     | N/A      | N/A  |
+-----------------------+-----------+---------+-----------+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
2 rows in set (0.092 sec)

MySQL [db1]> explain analyze select * from t1;
+-----------------------+-----------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| id                    | estRows   | actRows | task      | access object | execution info                                                                                                                                                                                                                                                                                                                                                                                      | operator info        | memory   | disk |
+-----------------------+-----------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| TableReader_5         | 183864.00 | 2700    | root      |               | time:57.2ms, loops:4, RU:24.485293, cop_task: {num: 9, max: 51.6ms, min: 720.9µs, avg: 7.03ms, p95: 51.6ms, max_proc_keys: 1004, p95_proc_keys: 1004, tot_proc: 52.7ms, tot_wait: 721.7µs, copr_cache_hit_ratio: 0.56, build_task_duration: 26.5µs, max_distsql_concurrency: 6}, rpc_info:{Cop:{num_rpc:9, total_time:63.1ms}}                                                                      | data:TableFullScan_4 | 101.9 KB | N/A  |
| └─TableFullScan_4     | 183864.00 | 2700    | cop[tikv] | table:t1      | tikv_task:{proc max:872ms, min:1ms, avg: 431ms, p80:858ms, p95:872ms, iters:23, tasks:9}, scan_detail: {total_process_keys: 2700, total_process_keys_size: 172343, total_keys: 123004, get_snapshot_time: 240.5µs, rocksdb: {block: {}}}, time_detail: {total_process_time: 52.7ms, total_suspend_time: 15.9µs, total_wait_time: 721.7µs, total_kv_read_wall_time: 54ms, tikv_wall_time: 56.3ms}    | keep order:false     | N/A      | N/A  |
+-----------------------+-----------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
2 rows in set (0.059 sec)

MySQL [db1]> explain analyze select * from t1;
+-----------------------+-----------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| id                    | estRows   | actRows | task      | access object | execution info                                                                                                                                                                                                                                                                                                                                                                                      | operator info        | memory   | disk |
+-----------------------+-----------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| TableReader_5         | 183864.00 | 3600    | root      |               | time:103.3ms, loops:5, RU:40.630365, cop_task: {num: 9, max: 96.2ms, min: 664.2µs, avg: 11.9ms, p95: 96.2ms, max_proc_keys: 1904, p95_proc_keys: 1904, tot_proc: 98.5ms, tot_wait: 1.19ms, copr_cache_hit_ratio: 0.56, build_task_duration: 28µs, max_distsql_concurrency: 6}, rpc_info:{Cop:{num_rpc:9, total_time:107.3ms}}                                                                       | data:TableFullScan_4 | 147.5 KB | N/A  |
| └─TableFullScan_4     | 183864.00 | 3600    | cop[tikv] | table:t1      | tikv_task:{proc max:872ms, min:0s, avg: 435.8ms, p80:858ms, p95:872ms, iters:23, tasks:9}, scan_detail: {total_process_keys: 3600, total_process_keys_size: 229794, total_keys: 144104, get_snapshot_time: 264.7µs, rocksdb: {block: {}}}, time_detail: {total_process_time: 98.5ms, total_suspend_time: 27.2µs, total_wait_time: 1.19ms, total_kv_read_wall_time: 97ms, tikv_wall_time: 101.3ms}   | keep order:false     | N/A      | N/A  |
+-----------------------+-----------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
2 rows in set (0.105 sec)

MySQL [db1]> explain analyze select * from t1;
+-----------------------+-----------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| id                    | estRows   | actRows | task      | access object | execution info                                                                                                                                                                                                                                                                                                                                                                                      | operator info        | memory   | disk |
+-----------------------+-----------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| TableReader_5         | 183864.00 | 9600    | root      |               | time:42.9ms, loops:11, RU:25.976801, cop_task: {num: 11, max: 26.5ms, min: 1.07ms, avg: 4.41ms, p95: 26.5ms, max_proc_keys: 3040, p95_proc_keys: 3040, tot_proc: 34.2ms, tot_wait: 1.39ms, copr_cache_hit_ratio: 0.45, build_task_duration: 30.6µs, max_distsql_concurrency: 6}, rpc_info:{Cop:{num_rpc:11, total_time:48.2ms}}                                                                     | data:TableFullScan_4 | 299.1 KB | N/A  |
| └─TableFullScan_4     | 183864.00 | 9600    | cop[tikv] | table:t1      | tikv_task:{proc max:872ms, min:0s, avg: 350.6ms, p80:830ms, p95:872ms, iters:37, tasks:11}, scan_detail: {total_process_keys: 9600, total_process_keys_size: 612781, total_keys: 149806, get_snapshot_time: 424.9µs, rocksdb: {block: {}}}, time_detail: {total_process_time: 34.2ms, total_suspend_time: 64.4µs, total_wait_time: 1.39ms, total_kv_read_wall_time: 32ms, tikv_wall_time: 38.1ms}   | keep order:false     | N/A      | N/A  |
+-----------------------+-----------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
2 rows in set (0.046 sec)

MySQL [db1]> explain analyze select * from t1;
+-----------------------+-----------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| id                    | estRows   | actRows | task      | access object | execution info                                                                                                                                                                                                                                                                                                                                                                                      | operator info        | memory   | disk |
+-----------------------+-----------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| TableReader_5         | 183864.00 | 5300    | root      |               | time:34.9ms, loops:7, RU:19.597421, cop_task: {num: 10, max: 26.2ms, min: 714.8µs, avg: 4.03ms, p95: 26.2ms, max_proc_keys: 2016, p95_proc_keys: 2016, tot_proc: 29.1ms, tot_wait: 1.45ms, copr_cache_hit_ratio: 0.50, build_task_duration: 34.7µs, max_distsql_concurrency: 6}, rpc_info:{Cop:{num_rpc:10, total_time:40.1ms}}                                                                     | data:TableFullScan_4 | 183.4 KB | N/A  |
| └─TableFullScan_4     | 183864.00 | 5300    | cop[tikv] | table:t1      | tikv_task:{proc max:872ms, min:0s, avg: 385.2ms, p80:858ms, p95:872ms, iters:29, tasks:10}, scan_detail: {total_process_keys: 5300, total_process_keys_size: 338309, total_keys: 165505, get_snapshot_time: 192.1µs, rocksdb: {block: {}}}, time_detail: {total_process_time: 29.1ms, total_suspend_time: 39.4µs, total_wait_time: 1.45ms, total_kv_read_wall_time: 27ms, tikv_wall_time: 32.9ms}   | keep order:false     | N/A      | N/A  |
+-----------------------+-----------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
2 rows in set (0.036 sec)

MySQL [db1]> explain analyze select * from t1;
+-----------------------+-----------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| id                    | estRows   | actRows | task      | access object | execution info                                                                                                                                                                                                                                                                                                                                                                                      | operator info        | memory   | disk |
+-----------------------+-----------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| TableReader_5         | 183864.00 | 7600    | root      |               | time:46.5ms, loops:9, RU:24.679955, cop_task: {num: 11, max: 30.8ms, min: 528.7µs, avg: 4.03ms, p95: 30.8ms, max_proc_keys: 3040, p95_proc_keys: 3040, tot_proc: 34.7ms, tot_wait: 602µs, copr_cache_hit_ratio: 0.45, build_task_duration: 34.4µs, max_distsql_concurrency: 6}, rpc_info:{Cop:{num_rpc:12, total_time:44.5ms},ResolveLock:{num_rpc:1, total_time:5.06ms}}                           | data:TableFullScan_4 | 257.0 KB | N/A  |
| └─TableFullScan_4     | 183864.00 | 7600    | cop[tikv] | table:t1      | tikv_task:{proc max:872ms, min:0s, avg: 350.8ms, p80:830ms, p95:872ms, iters:35, tasks:11}, scan_detail: {total_process_keys: 7600, total_process_keys_size: 485136, total_keys: 187806, get_snapshot_time: 231.4µs, rocksdb: {block: {}}}, time_detail: {total_process_time: 34.7ms, total_suspend_time: 22.2µs, total_wait_time: 602µs, total_kv_read_wall_time: 34ms, tikv_wall_time: 36.8ms}    | keep order:false     | N/A      | N/A  |
+-----------------------+-----------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
2 rows in set (0.048 sec)

TiKV 关闭 IME 的查询计划

MySQL [db1]> explain analyze select * from t1;
+-----------------------+---------+---------+-----------+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| id                    | estRows | actRows | task      | access object | execution info                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | operator info        | memory   | disk |
+-----------------------+---------+---------+-----------+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| TableReader_5         | 5200.00 | 10000   | root      |               | time:1.26s, loops:12, RU:1818.446342, cop_task: {num: 13, max: 1.26s, min: 2.21ms, avg: 512.5ms, p95: 1.26s, max_proc_keys: 3248, p95_proc_keys: 3248, tot_proc: 5.41s, tot_wait: 1.22s, copr_cache_hit_ratio: 0.00, build_task_duration: 25.5µs, max_distsql_concurrency: 8}, rpc_info:{Cop:{num_rpc:13, total_time:6.66s}}                                                                                                                                                        | data:TableFullScan_4 | 319.4 KB | N/A  |
| └─TableFullScan_4     | 5200.00 | 10000   | cop[tikv] | table:t1      | tikv_task:{proc max:890ms, min:0s, avg: 415.9ms, p80:749ms, p95:890ms, iters:40, tasks:13}, scan_detail: {total_process_keys: 10000, total_process_keys_size: 638330, total_keys: 19410809, get_snapshot_time: 393.4µs, rocksdb: {delete_skipped_count: 15200, key_skipped_count: 19425996, block: {cache_hit_count: 31728}}}, time_detail: {total_process_time: 5.41s, total_suspend_time: 1.88ms, total_wait_time: 1.22s, total_kv_read_wall_time: 5.41s, tikv_wall_time: 6.63s}  | keep order:false     | N/A      | N/A  |
+-----------------------+---------+---------+-----------+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
2 rows in set (1.258 sec)

MySQL [db1]> 
MySQL [db1]> 
MySQL [db1]> explain analyze select * from t1;
+-----------------------+---------+---------+-----------+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| id                    | estRows | actRows | task      | access object | execution info                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | operator info        | memory   | disk |
+-----------------------+---------+---------+-----------+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| TableReader_5         | 5200.00 | 5200    | root      |               | time:714.1ms, loops:7, RU:379.670041, cop_task: {num: 12, max: 713.7ms, min: 1.06ms, avg: 93.6ms, p95: 713.7ms, max_proc_keys: 2016, p95_proc_keys: 2016, tot_proc: 1.11s, tot_wait: 2.65ms, copr_cache_hit_ratio: 0.50, build_task_duration: 22.4µs, max_distsql_concurrency: 8}, rpc_info:{Cop:{num_rpc:12, total_time:1.12s}}                                                                                                                                                | data:TableFullScan_4 | 178.3 KB | N/A  |
| └─TableFullScan_4     | 5200.00 | 5200    | cop[tikv] | table:t1      | tikv_task:{proc max:890ms, min:0s, avg: 449.3ms, p80:746ms, p95:890ms, iters:31, tasks:12}, scan_detail: {total_process_keys: 5200, total_process_keys_size: 331931, total_keys: 4088202, get_snapshot_time: 441µs, rocksdb: {delete_skipped_count: 35200, key_skipped_count: 4123396, block: {cache_hit_count: 6554}}}, time_detail: {total_process_time: 1.11s, total_suspend_time: 12.7µs, total_wait_time: 2.65ms, total_kv_read_wall_time: 1.11s, tikv_wall_time: 1.11s}   | keep order:false     | N/A      | N/A  |
+-----------------------+---------+---------+-----------+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
2 rows in set (0.717 sec)

MySQL [db1]> 
MySQL [db1]> 
MySQL [db1]> explain analyze select * from t1;
+-----------------------+---------+---------+-----------+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| id                    | estRows | actRows | task      | access object | execution info                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | operator info        | memory   | disk |
+-----------------------+---------+---------+-----------+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| TableReader_5         | 5200.00 | 6500    | root      |               | time:395.1ms, loops:8, RU:141.154363, cop_task: {num: 12, max: 384ms, min: 1.1ms, avg: 33.8ms, p95: 384ms, max_proc_keys: 2788, p95_proc_keys: 2788, tot_proc: 387.4ms, tot_wait: 1.99ms, copr_cache_hit_ratio: 0.58, build_task_duration: 34.5µs, max_distsql_concurrency: 8}, rpc_info:{Cop:{num_rpc:12, total_time:405.7ms}}                                                                                                                                                     | data:TableFullScan_4 | 244.2 KB | N/A  |
| └─TableFullScan_4     | 5200.00 | 6500    | cop[tikv] | table:t1      | tikv_task:{proc max:890ms, min:0s, avg: 448.6ms, p80:746ms, p95:890ms, iters:32, tasks:12}, scan_detail: {total_process_keys: 6500, total_process_keys_size: 414910, total_keys: 1569501, get_snapshot_time: 302.1µs, rocksdb: {delete_skipped_count: 55200, key_skipped_count: 1624696, block: {cache_hit_count: 2341}}}, time_detail: {total_process_time: 387.4ms, total_suspend_time: 26.6µs, total_wait_time: 1.99ms, total_kv_read_wall_time: 385ms, tikv_wall_time: 394ms}   | keep order:false     | N/A      | N/A  |
+-----------------------+---------+---------+-----------+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
2 rows in set (0.399 sec)

MySQL [db1]> 
MySQL [db1]> 
MySQL [db1]> explain analyze select * from t1;
+-----------------------+---------+---------+-----------+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| id                    | estRows | actRows | task      | access object | execution info                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | operator info        | memory   | disk |
+-----------------------+---------+---------+-----------+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| TableReader_5         | 5200.00 | 9000    | root      |               | time:1.06s, loops:11, RU:856.101323, cop_task: {num: 13, max: 1.06s, min: 582.1µs, avg: 195.3ms, p95: 1.06s, max_proc_keys: 3040, p95_proc_keys: 3040, tot_proc: 2.52s, tot_wait: 2.56ms, copr_cache_hit_ratio: 0.38, build_task_duration: 34.6µs, max_distsql_concurrency: 8}, rpc_info:{Cop:{num_rpc:13, total_time:2.54s}}                                                                                                                                                                                                               | data:TableFullScan_4 | 268.7 KB | N/A  |
| └─TableFullScan_4     | 5200.00 | 9000    | cop[tikv] | table:t1      | tikv_task:{proc max:1.06s, min:0s, avg: 449.8ms, p80:746ms, p95:1.06s, iters:39, tasks:13}, scan_detail: {total_process_keys: 9000, total_process_keys_size: 574487, total_keys: 6710804, get_snapshot_time: 362.7µs, rocksdb: {delete_skipped_count: 65200, key_skipped_count: 6775996, block: {cache_hit_count: 2346, read_count: 8419, read_byte: 24.8 MB, read_time: 89.9ms}}}, time_detail: {total_process_time: 2.52s, total_suspend_time: 559.6µs, total_wait_time: 2.56ms, total_kv_read_wall_time: 2.52s, tikv_wall_time: 2.53s}   | keep order:false     | N/A      | N/A  |
+-----------------------+---------+---------+-----------+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
2 rows in set (1.066 sec)

MySQL [db1]> 
MySQL [db1]> 
MySQL [db1]> 
MySQL [db1]> explain analyze select * from t1;
+-----------------------+---------+---------+-----------+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| id                    | estRows | actRows | task      | access object | execution info                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | operator info        | memory   | disk |
+-----------------------+---------+---------+-----------+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| TableReader_5         | 5200.00 | 8100    | root      |               | time:414.3ms, loops:10, RU:147.802642, cop_task: {num: 13, max: 395.8ms, min: 653µs, avg: 32.4ms, p95: 395.8ms, max_proc_keys: 3040, p95_proc_keys: 3040, tot_proc: 401.2ms, tot_wait: 1.32ms, copr_cache_hit_ratio: 0.54, build_task_duration: 29.9µs, max_distsql_concurrency: 8}, rpc_info:{Cop:{num_rpc:13, total_time:421.4ms}}                                                                                                                                                   | data:TableFullScan_4 | 257.0 KB | N/A  |
| └─TableFullScan_4     | 5200.00 | 8100    | cop[tikv] | table:t1      | tikv_task:{proc max:1.06s, min:0s, avg: 449.6ms, p80:746ms, p95:1.06s, iters:38, tasks:13}, scan_detail: {total_process_keys: 8100, total_process_keys_size: 517029, total_keys: 1610802, get_snapshot_time: 466.6µs, rocksdb: {delete_skipped_count: 75200, key_skipped_count: 1685996, block: {cache_hit_count: 2343}}}, time_detail: {total_process_time: 401.2ms, total_suspend_time: 316.5µs, total_wait_time: 1.32ms, total_kv_read_wall_time: 400ms, tikv_wall_time: 405.7ms}   | keep order:false     | N/A      | N/A  |
+-----------------------+---------+---------+-----------+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
2 rows in set (0.416 sec)

MySQL [db1]> explain analyze select * from t1;
+-----------------------+---------+---------+-----------+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| id                    | estRows | actRows | task      | access object | execution info                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | operator info        | memory   | disk |
+-----------------------+---------+---------+-----------+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| TableReader_5         | 5200.00 | 7600    | root      |               | time:438.6ms, loops:9, RU:155.607615, cop_task: {num: 13, max: 418.9ms, min: 1.14ms, avg: 34.2ms, p95: 418.9ms, max_proc_keys: 3040, p95_proc_keys: 3040, tot_proc: 424.7ms, tot_wait: 2.55ms, copr_cache_hit_ratio: 0.54, build_task_duration: 35.1µs, max_distsql_concurrency: 8}, rpc_info:{Cop:{num_rpc:14, total_time:446.3ms},ResolveLock:{num_rpc:1, total_time:2.37ms}}                                                                                                       | data:TableFullScan_4 | 257.0 KB | N/A  |
| └─TableFullScan_4     | 5200.00 | 7600    | cop[tikv] | table:t1      | tikv_task:{proc max:1.06s, min:0s, avg: 451.4ms, p80:746ms, p95:1.06s, iters:37, tasks:13}, scan_detail: {total_process_keys: 7600, total_process_keys_size: 485121, total_keys: 1630602, get_snapshot_time: 407.5µs, rocksdb: {delete_skipped_count: 85200, key_skipped_count: 1715796, block: {cache_hit_count: 2343}}}, time_detail: {total_process_time: 424.7ms, total_suspend_time: 34.1µs, total_wait_time: 2.55ms, total_kv_read_wall_time: 423ms, tikv_wall_time: 430.4ms}   | keep order:false     | N/A      | N/A  |
+-----------------------+---------+---------+-----------+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
2 rows in set (0.441 sec)

MySQL [db1]> 
MySQL [db1]> 
MySQL [db1]> explain analyze select * from t1;
+-----------------------+---------+---------+-----------+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| id                    | estRows | actRows | task      | access object | execution info                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | operator info        | memory   | disk |
+-----------------------+---------+---------+-----------+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| TableReader_5         | 5200.00 | 3400    | root      |               | time:427.4ms, loops:5, RU:148.626396, cop_task: {num: 11, max: 418.4ms, min: 699.4µs, avg: 39.7ms, p95: 418.4ms, max_proc_keys: 1704, p95_proc_keys: 1704, tot_proc: 420.3ms, tot_wait: 1.74ms, copr_cache_hit_ratio: 0.64, build_task_duration: 47.6µs, max_distsql_concurrency: 8}, rpc_info:{Cop:{num_rpc:11, total_time:436.8ms}}                                                                                                                                                 | data:TableFullScan_4 | 137.4 KB | N/A  |
| └─TableFullScan_4     | 5200.00 | 3400    | cop[tikv] | table:t1      | tikv_task:{proc max:1.06s, min:0s, avg: 533.1ms, p80:746ms, p95:1.06s, iters:25, tasks:11}, scan_detail: {total_process_keys: 3400, total_process_keys_size: 217031, total_keys: 1646500, get_snapshot_time: 356.5µs, rocksdb: {delete_skipped_count: 95200, key_skipped_count: 1741696, block: {cache_hit_count: 2339}}}, time_detail: {total_process_time: 420.3ms, total_suspend_time: 24.1µs, total_wait_time: 1.74ms, total_kv_read_wall_time: 419ms, tikv_wall_time: 425.3ms}   | keep order:false     | N/A      | N/A  |
+-----------------------+---------+---------+-----------+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
2 rows in set (0.432 sec)

MySQL [db1]> explain analyze select * from t1;
+-----------------------+---------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| id                    | estRows | actRows | task      | access object | execution info                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | operator info        | memory   | disk |
+-----------------------+---------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| TableReader_5         | 5200.00 | 10000   | root      |               | time:535.2ms, loops:12, RU:191.412069, cop_task: {num: 13, max: 509ms, min: 1.04ms, avg: 66.4ms, p95: 509ms, max_proc_keys: 3248, p95_proc_keys: 3248, tot_proc: 526.5ms, tot_wait: 313.1ms, copr_cache_hit_ratio: 0.54, build_task_duration: 43.4µs, max_distsql_concurrency: 8}, rpc_info:{Cop:{num_rpc:13, total_time:863.2ms}}                                                                                                                                                      | data:TableFullScan_4 | 319.4 KB | N/A  |
| └─TableFullScan_4     | 5200.00 | 10000   | cop[tikv] | table:t1      | tikv_task:{proc max:1.06s, min:2ms, avg: 459.3ms, p80:746ms, p95:1.06s, iters:40, tasks:13}, scan_detail: {total_process_keys: 10000, total_process_keys_size: 638325, total_keys: 1660878, get_snapshot_time: 335µs, rocksdb: {delete_skipped_count: 132112, key_skipped_count: 1792984, block: {cache_hit_count: 2343}}}, time_detail: {total_process_time: 526.5ms, total_suspend_time: 95.6µs, total_wait_time: 313.1ms, total_kv_read_wall_time: 526ms, tikv_wall_time: 851.9ms}   | keep order:false     | N/A      | N/A  |
+-----------------------+---------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
2 rows in set (0.537 sec)

MySQL [db1]> 
MySQL [db1]> 
MySQL [db1]> explain analyze select * from t1;
+-----------------------+---------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| id                    | estRows | actRows | task      | access object | execution info                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | operator info        | memory   | disk |
+-----------------------+---------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
| TableReader_5         | 5200.00 | 6100    | root      |               | time:446.8ms, loops:8, RU:156.705616, cop_task: {num: 12, max: 428.8ms, min: 845.2µs, avg: 37.7ms, p95: 428.8ms, max_proc_keys: 2388, p95_proc_keys: 2388, tot_proc: 433.8ms, tot_wait: 1.37ms, copr_cache_hit_ratio: 0.58, build_task_duration: 24.4µs, max_distsql_concurrency: 8}, rpc_info:{Cop:{num_rpc:13, total_time:452.6ms},ResolveLock:{num_rpc:1, total_time:1.25ms}}                                                                                                        | data:TableFullScan_4 | 223.9 KB | N/A  |
| └─TableFullScan_4     | 5200.00 | 6100    | cop[tikv] | table:t1      | tikv_task:{proc max:1.06s, min:1ms, avg: 489.8ms, p80:746ms, p95:1.06s, iters:32, tasks:12}, scan_detail: {total_process_keys: 6100, total_process_keys_size: 389390, total_keys: 1669101, get_snapshot_time: 395.8µs, rocksdb: {delete_skipped_count: 105200, key_skipped_count: 1774296, block: {cache_hit_count: 2341}}}, time_detail: {total_process_time: 433.8ms, total_suspend_time: 37.9µs, total_wait_time: 1.37ms, total_kv_read_wall_time: 433ms, tikv_wall_time: 437.8ms}   | keep order:false     | N/A      | N/A  |
+-----------------------+---------+---------+-----------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------+------+
2 rows in set (0.449 sec)

测试结论

IME 开启时的性能表现

  1. 查询时间范围:28ms - 103ms
  2. 平均查询时间:约50-60ms
  3. scan_detail 显示较少的 total_keys(10万-18万级别)

IME 关闭后的性能表现

  1. 查询时间范围:395ms - 1.26s

  2. 平均查询时间:约500-700ms

  3. scan_detail 显示较多的 total_keys(大部分情况下需要扫描 160 万以上), rocksdb 中 key_skipped_count 也较大。

关键差异对比

指标

IME开启

IME关闭

性能提升

平均查询时间

~50ms

~600ms

12倍

扫描键数量

10~18万

190~420万

减少20~30倍

删除键跳过

1.5~16万

显著减少

对比开启IME和关闭IME的SQL执行结果,相同查询SQL的执行耗时看,开启IME后SQL执行耗时远低于关闭IME后的SQL执行耗时。

0
0
0
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论