Definition · Read, update and memory amplificationFor a storage engine, read amplification RA is the number of storage reads a logical lookup performs; update amplification UA is the bytes written to storage per byte ingested; memory amplification MA is the bytes occupied per byte of unique data.
The RUM conjecture is that no engine minimises all three: a design that is best in one is, in general, worse in at least one other.
Memory amplification is a measure of space, not of RAM. A tiered tree with MA = 10 is keeping ten copies of a key on disk while it waits to merge them, and that is ten times the storage bill for the same unique data. The word is historical and it costs people an argument every time.
F = 10 L = 5 ingest 50 MB/s 4 kB pages, 128 B rows, ⅔ fill
engine read update memory bandwidth at 50 MB/s
levelled LSM 5 25 11/10 1.25 GB/s
tiered LSM 50 5 10 250.00 MB/s
B-tree 4 125/4 = 31.25 3/2 1.56 GB/s
levelled RA = L UA = L·F/2 MA = 1 + 1/F
tiered RA = L·F UA = L MA = F
B-tree RA = height UA = page/row MA = 1/fill
The two LSM rows are the same tree with two compaction policies. A levelled tree merges each incoming run into the level below immediately, so each level holds one sorted run and a lookup probes L of them — at the cost of rewriting F/2 bytes per byte per level. A tiered tree lets runs accumulate and merges F of them at once, so it writes each byte once per level and a lookup has F runs to search on every level. RA and UA swap places almost exactly.
Example · Where a B-tree's triple comes fromNothing in the B-tree row is a table lookup. Its read amplification is the height — 4, from a billion keys at a fanout of 500, by the integer search of “The Height of a B-tree”. Its update amplification is page over row: writing a whole 4 000 B page to change a 128 B row is 4 000/128 = 31.25. Its memory amplification is one over the fill factor: pages kept about two-thirds full occupy 1/(2/3) = 3/2 times the space of the rows in them.
The bandwidth question
Compaction bandwidth is ingest × UA, and it is the number a device is chosen against. At 50 MB/s the levelled tree needs 1.25 GB/s, the B-tree 1.56 GB/s and the tiered tree 250.00 MB/s. The tiered engine is the only one of the three that a modest device can feed, and it is also the one that will probe fifty runs to answer a lookup. That is the trade stated in the two units that matter.
So the way to use the triangle is not to rank the corners. It is to name the amplification your workload cannot afford and then read what the other two cost. A write-heavy ingest pipeline that is queried rarely can live at the tiered corner. A point-lookup service on expensive storage cannot afford MA = 10 and will not go there. A workload with both constraints is a workload that needs two engines.
What the triple does not include: compression, which moves MA and nothing else; a block cache, which moves the observed RA without moving the engine's; and any constant factor at all. These are ratios, so they compare shapes rather than products, and an implementation can be a factor of two better or worse than its shape at every corner.