# 热点小表缓存

+ 表的数据量不大
+ 只读取或修改不经常更改的表格
+ 表的读取访问非常频繁

![`smart`](HotSubtableCache_aa_002_20220509.png)

```
ALTER TABLE {table_name} ~!@CACHE@!~;
```

------------------------------------------------------------------------------
TiDB在6.0.0版本中引入了缓存表功能。这个功能适用于频繁访问且很少修改的热点小表，即将整个表的数据加载到TiDB服务器的内存中，直接从内存中获取表数据，避免从TiKV服务器获取表数据，从而提高读取性能。

我们可以使用以下方法将已创建的表缓存到 TiDB 服务器的内存中：

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

TiDB 缓存表功能适用于具有以下特征的表：
- 这个表的数据量不大。
- 只读，几乎从不修改。
- 对表的访问频繁，期望更好的读取性能。

当表的数据量不大且访问特别频繁时，数据会集中在TiKV的某个Region上，形成热点，从而影响性能。因此，TiDB缓存表的典型使用场景如下：
- 静态配置表。业务通过配置表读取配置信息。
- 一张存储汇率的表格，在金融场景中，不是实时更新，只每天更新一次。
- 银行分行或零售店查询表，这张表很少添加新的记录项。

例如，当业务重新启动时，所有会话会同时加载配置，这将导致数据库读取延迟更高。如果使用缓存表，可以解决这个问题。

因为TiDB会将整个缓存表数据加载到TiDB服务器的内存中，而且在修改操作后缓存会失效，所以需要重新加载，所以TiDB缓存表只适合相对较小的表的场景。

现在，TiDB 限制每个缓存表的大小为 64 MB。如果表数据超过 64 MB，执行 `ALTER TABLE ... CACHE` 语句将会失败。
