# 热点小表缓存

+ 表的数据量不大
+ 只读表或者修改不频繁的表
+ 表的读取访问很频繁

![`smart`](/HotSubtableCache_aa_001_20220509.png)

------------------------------------------------------------------------------
TiDB 在 v6.0.0 版本中引入了缓存表功能。该功能适用于频繁被访问且很少被修改的热点小表, 即把整张表的数据加载到 TiDB server 的内存中, 直接从内存中获取表数据, 避免从 TiKV server 获取表数据, 从而提升读性能。

我们可以采用如下方法将一张已经创建好的表缓存在 TiDB server 的内存中:

```
CREATE TABLE users (
    id BIGINT,
    name VARCHAR(100),
    PRIMARY KEY(id)
);
ALTER TABLE users CACHE;
```

TiDB 缓存表功能适用于以下特点的表:
- 表的数据量不大
- 只读表,或者几乎很少修改
- 表的访问很频繁,期望有更好的读性能

当表的数据量不大, 访问又特别频繁的情况下, 数据会集中在 TiKV 的一个 Region 上, 形成热点, 从而影响性能。因此, TiDB 缓存表的典型使用场景如下:
- 静态配置表。业务通过该配置表读取配置信息。
- 金融场景中的存储汇率的表, 该表不会实时更新, 每天只更新一次。
- 银行分行或者网点信息表, 该表很少新增记录项。

以配置表为例, 当业务重启的瞬间, 全部会话一起加载配置, 会造成较高的数据库读延迟。如果使用了缓存表, 则可以解决这样的问题。

由于 TiDB 将整张缓存表的数据加载到 TiDB server 的内存中, 并且执行修改操作后缓存会失效, 需要重新加载, 所以 TiDB 缓存表只适用于表比较小的场景。

目前 TiDB 对于每张缓存表的大小限制为 64 MB。如果表的数据超过了 64 MB, 执行语句 `ALTER TABLE ... CACHE` 会失败。