Todo banco precisa achar uma linha rápido sem varrer a tabela inteira. Os dois jeitos dominantes de fazer isso puxam pra lados opostos: a B-tree otimiza leitura, a LSM-tree otimiza escrita. Insere as mesmas chaves nas duas aqui embaixo e olha a estrutura crescer de formas diferentes.
Insere algumas chaves nas duas estruturas e depois busca uma. Repara: a B-tree acha em poucos nós (altura baixa); a LSM precisa checar a memtable e cada SSTable até encontrar.
Os dois resolvem o mesmo problema (achar uma chave sem full scan), mas com filosofias opostas de I/O. A B-tree atualiza a página no lugar: ótima leitura, mas o write é aleatório no disco. A LSM só faz append (memtable em RAM, depois SSTables ordenadas): write rápido e sequencial, mas a leitura paga por checar vários níveis.
B-tree
LSM-tree
Write
in-place (aleatório)
append (sequencial)
Read
poucos I/O
vários níveis + bloom
Brilha em
leitura / OLTP
escrita pesada
Usado por
Postgres, MySQL
Cassandra, RocksDB, LevelDB
B-tree (o nó é uma página de disco)
typeBNodestruct {
keys []int
children []*BNode
leaf bool
}
// cada nó = 1 página (4-8 KB), então guarda// dezenas/centenas de chaves. Nó largo =// árvore rasa = menos I/O por busca.
LSM (memtable → SSTable)
func (t *LSM) Put(k, v []byte) {
t.mem.Insert(k, v) // rápido, em RAMif t.mem.Size() >= threshold {
t.flush() // vira SSTable ordenada no disco
}
}
// read: memtable, depois SSTables (nova→velha);// bloom filter pula as que não têm a chave.
🧠 Desafio — Índices
Insere e busca nas duas estruturas aqui de cima antes de responder. As duas últimas são de reflexão: escreve a sua e só então revela o modelo.