# `RocksDB:` Column Families

__*Column Families*__
__*列族*__
__*列簇*__

![`smart`](RocksDBColumnFamilies_aa_002_20220511.png)
-------------------------------------------------------------
`Column Families` 功能的支持是从 `RocksDB 3.0`开始的, `RocksDB` 的每个 `key-value` 都与唯一一个 `Column Family`对应。如果没有指定`Column Family`,键值对将会对应到 `default Column Family`,这个也是 `RocksDB` 实例的默认 `Column Family`。

`Column Family` 提供了一种从逻辑上给数据库分片的方法。它的一些功能包括:
- 支持跨`Column Family`的原子写。意味着您可以原子执行 `Write({cf1, key1, value1 }, {cf2, key2, value2 })`。
- 跨`Column Family`的一致性视图。
- 允许对不同的`Column Family`进行不同的配置。
- 即时添加／删除`Column Family`,两个操作都非常快。

另一个我们需要注意的是`Column Family`的主要实现思想是它们共享一个 `WAL` 日志, 但是不共享 `MemTable` 和 `SSTable` 文件。通过共享 `WAL` 文件,实现了原子写。通过隔离 `MemTable` 和 `SSTable` 文件,我们可以独立配置每个`Column Family` 并且快速删除它们。

每当一个单独的`Column Family` 刷盘,我们就创建一个新的 `WAL` 日志文件。所有`Column Family`的所有新的写入都会写入到新的 `WAL` 日志文件。但是,我们还不能删除旧的 `WAL`, 因为他还有一些对其他`Column Family`有用的数据。我们只能在所有的`Column Family` 都把这个 `WAL` 日志里的数据刷盘了, 才能删除这个 `WAL` 日志文件, 确保你的所有`Column Family`都会有规律地刷盘。

