# RocksDB: Column Families

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

![left](./student-guide/diagram/RocksDBColumnFamilies_aa_001_20220511.png)
-------------------------------------------------------------
上面已经介绍了,RocksDB 的基本架构和读写,从而我们可以看到 TiKV 就是集成了 RocksDB 来完成了最基本的数据持久化。接下来,我们再介绍 RocksDB 的另一个特征,那就是 Column Families,这个特征和后面 TiKV 对于事务的支持有关,所以需要我们了解。

Column Families 特征的支持是从 RocksDB 3.0 开始的,RocksDB 的每个键值对（key - value）都与唯一一个列族（Column Family）对应。如果没有指定列族（Column Family）,键值对将会对应到 "default"  列族（Column Family）,这个也是 RocksDB 实例的默认列族（Column Family）。

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

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

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

到此为止,我们介绍完了 Column Families,我们知道了,一个 RocksDB 实例可以有多个列族（Column Family）,每个列族（Column Family）对应一个键值对（ key - value ）,每个列族（Column Family）有自己的 MemTable 和 Table 文件,但是所有的列族（Column Family）共享一份 WAL 日志。这个其实就是 RocksDB 实例的分片。












