# RocksDB - Column Families

![center](./student-guide/diagram/03-RocksDB-Column-Families-01-01.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 实例的分片。












