The RUM conjecture: read, update, memory — pick two
No access method minimizes read, write, and space overhead at once; every storage engine is a chosen point on that triangle.
What are you trying to do?
Pick a storage engine by the workload's read/write mix, not by the product's popularity.
Why are you doing it?
Making reads cheap means maintaining structure at write time (sorted pages, indexes), which costs writes. Making writes cheap means deferring that structure (append now, organize later), which costs reads or space until compaction catches up. Making space cheap means giving up redundant structures that speed up one or the other. The RUM conjecture (Athanassoulis et al., 2016) names that triangle; storage engine families are its corners.
Swipe sideways if the diagram is cut off.
- Read overhead
- Corner = cheap reads: few I/Os per lookup or scan
- Update overhead
- Corner = cheap writes: little extra data written per logical write
- Memory overhead
- Corner = cheap space: few extra bytes stored per live byte, including indexes
Marker positions are qualitative, drawn from the amplification column of the storage-engine table, not measured. Moving toward one corner moves away from the others.
Database InternalsDesigning Data-Intensive Applications (2nd ed.)
How are you going to do it?
- Measure the workload first: write rate, read pattern (point vs range vs full scan), and how much data is hot.
- Express engine costs as amplification: read amplification (I/Os per logical read), write amplification (bytes written per logical byte), space amplification (bytes stored per live byte).
- Choose the engine whose cheap corner matches the dominant operation, then tune the knobs that move along the triangle (fill factor, compaction strategy, bloom filter size).