B-tree vs LSM-treeread vs write
Dois jeitos de achar uma chave sem full scan. B-tree atualiza a página no lugar: leitura em poucos I/O, escrita aleatória. LSM só faz append (memtable, depois SSTables): escrita sequencial rápida, leitura paga por checar vários níveis.
// B-tree: poucos nós lidos
// LSM: memtable + N SSTables
Read vs write amplificationo trade-off real
B-tree tem write amplification (reescreve a página inteira pra mudar uma linha). LSM tem read amplification (uma leitura visita memtable + várias SSTables) e compaction em background pra controlar isso.
Bloom filterpula SSTable
Estrutura probabilística que responde "a chave com certeza não está aqui" ou "talvez esteja". A LSM usa por SSTable pra pular os níveis que não têm a chave, cortando a read amplification. Falso positivo existe, falso negativo não.
WAL & fsynco D do ACID
A mudança vai pro log sequencial antes da página de dado, e o commit só confirma depois do fsync. Log é append barato; páginas vão depois, em lote. Caiu no meio? O restart faz replay e reconstrói o que foi commitado.
wal.Write(rec) // 1. append
wal.Sync() // 2. fsync = durável
ACID · as 4A · C · I · D
Atomicidade: tudo ou nada. Consistência: vai de um estado válido a outro respeitando invariantes. Isolamento: concorrentes não enxergam o meio uma da outra. Durabilidade: depois do commit, sobrevive a crash.
Atomicidade & rollbacktudo ou nada
Falhou no meio, o banco usa o log pra desfazer cada mudança na ordem inversa, e os efeitos somem como se nada tivesse rodado. Tudo que faz parte da transação tem que passar por tx, nunca pelo db direto, senão escapa do rollback.
defer tx.Rollback() // no-op se já commitou
C do ACID vs C do CAPnão confunda
Mesma letra, mundos diferentes. No ACID, C é o banco respeitando constraints e invariantes (saldo não fica negativo, FK aponta pra algo que existe). No CAP, C é réplicas concordando no valor mais recente. Não troque um pelo outro.
Anomalias de isolamento3 brechas
Dirty read: leu algo que outra tx ainda não commitou (e talvez fez rollback). Non-repeatable: a mesma query deu valores diferentes na mesma tx. Phantom: a mesma query passou a casar uma linha nova inserida no meio.
Níveis de isolamentomatriz SQL
Quem escolhe é a transação, não o banco inteiro. O padrão da maioria é Read Committed. Você sobe o nível só onde a anomalia dói mais que a perda de concorrência.
// nível dirty non-rep phantom
Read Committed x ok ok
Repeatable Read x x ok*
Serializable x x x
MVCC & VACUUMleitor não trava escritor
O banco guarda várias versões da linha. Cada transação lê o snapshot que enxerga, então leitura não bloqueia escrita nem vice-versa. O preço: versões antigas viram lixo, e o VACUUM as recolhe. (No Postgres o Repeatable Read é snapshot e já barra phantom.)
Sharding: hash vs rangehotspot
Não cabe num nó? Divide entre shards. Por hash: carga uniforme, mas range query espalha por todos. Por range: vizinhos no mesmo shard (range query local), mas chave sequencial (timestamp, ID crescente) concentra tudo num shard só, o hotspot.
// hash: hash32(k) % n → liso
// range: faixas → query local, risco hotspot