El motor

Una base de datos seria en un solo fichero — todo lo que se afirma aquí abajo se entrega hoy en el crate open source.

SQL y esquema

Dialecto amplio
JOIN, GROUP BY/HAVING, DISTINCT, agregados (incl. GROUP_CONCAT), subconsultas, CTEs (WITH), UNION, CASE, CAST, BETWEEN, ||, más una biblioteca de funciones escalares y de fecha/hora.
Vistas y triggers
CREATE VIEW; triggers a nivel de fila BEFORE/AFTER sobre INSERT/UPDATE/DELETE con OLD/NEW.
Integridad
Claves foráneas con ON DELETE RESTRICT, CASCADE y SET NULL.
ALTER TABLE lógico
ADD, DROP, RENAME, MOVE y REORDER COLUMN sin reescribir una sola fila — y seguro para el viaje en el tiempo.
Índices secundarios
CREATE [UNIQUE] INDEX sobre B-tree; el planificador los usa para igualdades, rangos y búsquedas multicolumna, con pushdown determinista de predicados en los JOIN.

Búsqueda

Texto completo, nativo
MATCH con ranking BM25, snippet() y highlight(), acelerado por índice. Las posting lists comprimidas por prefijo mantienen el índice por debajo de SQLite FTS5.
Vectorial / semántica
Columnas vectoriales f32 e int8; KNN exacto más ANN vía CREATE VECTOR INDEX … USING cosine|l2 (IVF / IVF-PQ); el RRF híbrido combina BM25 y vectores. El índice es ≈10–20× más pequeño que HNSW.
Búsqueda con viaje en el tiempo
MATCH … AS OF consulta el pasado — algo que ningún motor de búsqueda dedicado ofrece.
Construcción de índices que escala
Paralela (k-means, asignación y PQ en todos los núcleos) y en streaming — el dataset nunca se materializa, así que decenas de millones de filas caben en una máquina modesta.

Almacenamiento y velocidad

El fichero es el WAL
B-tree append-only con copy-on-write. Un fichero por tenant: el backup es cp, la restauración es cp.
Durabilidad
ACID con recuperación por tail-scan y un solo fsync por commit. El group commit agrupa a los committers concurrentes — en torno a 4.6× de throughput durable con 16 hilos.
Cargas masivas
bulk_insert ejecuta todo el lote en una única transacción sin ejecutor por fila — 2.5M filas/s en nuestros benches.
Lecturas en streaming
Los SELECT simples fluyen con decodificación perezosa: solo las columnas proyectadas, directamente desde la página. La API tipada del motor sirve búsquedas puntuales ~3.7× más rápido que la vía SQL.
Concurrencia
Lectores concurrentes sin lock global — cada lectura es un snapshot inmutable.

Integridad y criptografía

Historia encadenada por hash
Cada commit se encadena con SHA-256; manipular el pasado es detectable. verify() con anclas demuestra que el fichero está intacto.
Cifrado en reposo
AES-256-GCM por página (opcional) — la PII nunca toca el disco en claro.
Autorreparación
Reed–Solomon por página (opcional) corrige el bit-rot en lugar de limitarse a detectarlo; scrub() recorre el fichero.
Compresión y mantenimiento
LZSS en Rust puro por página; vacuum con retención y rotación de claves, renombrado atómico.

Tiempo y ramas

AS OF
SELECT … AS OF <versión o timestamp> — más history(), diff_versions() y changes().
Ramifica y fusiona datos
Ramas de datos con diff y merge a tres bandas, sobre el modelo conceptual de Git. Prueba una migración en una rama; fusiónala cuando se demuestre sólida.

Ponlo a prueba

O mira lo que estas decisiones aportan en números.

Lee el código fuente