下推计算结果缓存

TiDB 从 4.0 起支持下推计算结果缓存(即 Coprocessor Cache 功能)。开启该功能后,将在 TiDB 实例侧缓存下推给 TiKV 计算的结果,在部分场景下起到加速效果。

配置

Coprocessor Cache 的配置均位于 TiDB 的 tikv-client.copr-cache 配置项中。Coprocessor 的具体开启和配置方法,见 TiDB 配置文件描述

特性说明

  • 所有 SQL 在单个 TiDB 实例上的首次执行都不会被缓存。

  • 缓存仅存储在 TiDB 内存中,TiDB 重启后缓存会失效。

  • 不同 TiDB 实例之间不共享缓存。

  • 缓存的是下推计算结果,即使缓存命中,后续仍有 TiDB 计算。

  • 缓存以 Region 为单位。对 Region 的写入会导致涉及该 Region 的缓存失效。基于此原因,该功能主要会对很少变更的数据有效果。

  • 下推计算请求相同时,缓存会被命中。通常在以下场景下,下推计算的请求是相同或部分相同的:

    • SQL 语句完全一致,例如重复执行相同的 SQL 语句。

      该场景下所有下推计算的请求都是一致的,所有请求都能利用上下推计算缓存。

    • SQL 语句包含一个变化的条件,其他部分一致,变化的条件是表主键或分区主键。

      该场景下一部分下推计算的请求会与之前出现过的一致,部分请求能利用上下推计算结果缓存。

    • SQL 语句包含多个变化的条件,其他部分一致,变化的条件完全匹配一个复合索引列。

      该场景下一部分下推计算的请求会与之前出现过的一致,部分请求能利用上下推计算结果缓存。

  • 该功能对用户透明,开启和关闭都不影响计算结果,仅影响 SQL 执行时间。

检验缓存效果

可以通过执行 EXPLAIN ANALYZE 或查看 Grafana 监控面板来检查 Coprocessor 的缓存效果。

使用 EXPLAIN ANALYZE

用户可以通过 EXPLAIN ANALYZE 语句查看读表算子中的缓存命中率,示例如下:

  1. EXPLAIN ANALYZE SELECT * FROM t USE INDEX(a);
  2. +-------------------------------+-----------+---------+-----------+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------+-----------------------+------+
  3. | id | estRows | actRows | task | access object | execution info | operator info | memory | disk |
  4. +-------------------------------+-----------+---------+-----------+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------+-----------------------+------+
  5. | IndexLookUp_6 | 262400.00 | 262400 | root | | time:620.513742ms, loops:258, cop_task: {num: 4, max: 5.530817ms, min: 1.51829ms, avg: 2.70883ms, p95: 5.530817ms, max_proc_keys: 2480, p95_proc_keys: 2480, tot_proc: 1ms, tot_wait: 1ms, rpc_num: 4, rpc_time: 10.816328ms, copr_cache_hit_rate: 0.75} | | 6.685169219970703 MB | N/A |
  6. | ├─IndexFullScan_4(Build) | 262400.00 | 262400 | cop[tikv] | table:t, index:a(a, c) | proc max:93ms, min:1ms, p80:93ms, p95:93ms, iters:275, tasks:4 | keep order:false, stats:pseudo | 1.7549400329589844 MB | N/A |
  7. | └─TableRowIDScan_5(Probe) | 262400.00 | 0 | cop[tikv] | table:t | time:0ns, loops:0 | keep order:false, stats:pseudo | N/A | N/A |
  8. +-------------------------------+-----------+---------+-----------+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------+-----------------------+------+
  9. 3 rows in set (0.62 sec)

执行结果的 execution info 列有 copr_cache_hit_ratio 信息,表示下推计算结果缓存的命中率。以上示例的 0.75 表示命中率大约是 75%。

查看 Grafana 监控面板

在 Grafana 监控中,tidb 命名空间下 distsql 子系统中可见 copr-cache 面板,该面板监控整个集群中下推计算结果缓存的命中次数、未命中次数和缓存丢弃次数。