What are Column Families?
A column family is a logical partition within a RocksDB database. Each column family:- Has its own LSM tree structure
- Can have independent configuration (compression, compaction, etc.)
- Shares the same Write-Ahead Log (WAL) for durability
- Supports atomic writes across multiple column families
Think of column families as separate key-value stores within one database, but with the ability to write to multiple families atomically.
Creating Column Families
Opening a Database with Column Families
Every RocksDB database has at least one column family called “default”:You must open ALL existing column families when opening a database. Use
DB::ListColumnFamilies() to discover existing column families.Listing Existing Column Families
Creating New Column Families
Reading and Writing Data
Writing to Column Families
Atomic Writes Across Column Families
UseWriteBatch for atomic writes across multiple column families:
All operations in a WriteBatch either succeed together or fail together, even across different column families.
Reading from Column Families
Iterating Over Column Families
Independent Configuration
Each column family can have different settings optimized for its data:- Write-Heavy CF
- Read-Heavy CF
- Archive CF
Optimize for high write throughput:
Use Cases
Multi-Tenant Applications
Multi-Tenant Applications
Store each tenant’s data in a separate column family:Benefits: Independent compaction, easy tenant deletion, per-tenant statistics
Data with Different Lifecycles
Data with Different Lifecycles
Separate hot and cold data:
Different Data Types
Different Data Types
Optimize each data type separately:
Managing Column Families
Dropping Column Families
Dropping a column family marks it for deletion but doesn’t immediately free space. Files are deleted during compaction.
Getting Column Family Metadata
Dynamic Options
Change column family options at runtime:Shared Resources
While column families have independent LSM trees, they share some resources:- Independent
Cleanup
Always properly destroy column family handles:Column family handles must be destroyed before closing the database.
Best Practices
- Use column families for logical partitions with different access patterns
- Limit the number of column families (typically < 100) to avoid resource overhead
- Share block cache across column families to maximize cache efficiency
- Use atomic WriteBatch when consistency across families is required
- Monitor per-CF statistics to identify performance issues
- Always destroy handles before closing the database
Next Steps
LSM Tree Design
Understand the LSM structure behind column families
Compaction
Learn about per-CF compaction strategies
Write-Ahead Log
See how WAL works across column families
Performance Tuning
Optimize column family configurations