Skip to content
← Torna al blog

Cercare tra 50.000 email in millisecondi: come funziona l’indice locale di MailVault

7 min di lettura

Scrivi una parola in MailVault e le corrispondenze più recenti sono già sullo schermo prima che tu finisca di premere il tasto. Per verificare che valga anche con una casella davvero enorme, abbiamo costruito un vault da 50.000 messaggi e misurato la ricerca. La query più lenta che abbiamo provato ha impiegato 14 millisecondi.

Questo articolo riporta i numeri reali, che cosa è stato misurato e che cosa no, e la tecnologia che sta dietro: un piccolo e semplice database SQL che vive dentro il tuo vault.

Il test

Abbiamo generato 50.000 messaggi di circa 3,3 KB ciascuno, nella forma multipart HTML più testo semplice tipica della posta reale. Sono distribuiti in tre cartelle (Inbox, Archive e Sent, circa un terzo ciascuna) con parole note inserite a frequenze note: «invoice» nel 5% dei messaggi, «budget» nell’8%, «meeting» nel 6%, più parole giapponesi e con accenti per mettere alla prova la ricerca non inglese. Ogni messaggio è passato dal vero parser MIME e dal vero codice di indicizzazione di MailVault, in una build di release.

La macchina era un Mac mini Apple M4 con 16 GB di memoria. Non era inattiva: durante i test erano in corso altre build, quindi considera i tempi come quelli che ottieni su un computer occupato. Ogni query è stata eseguita sei volte, tre su una build di prova della correzione e tre sul codice integrato. I valori qui sotto sono l’intervallo di quelle esecuzioni, e ogni tempo comprende la ricerca più la costruzione delle righe dei risultati che vedi nell’elenco.

I risultati

50,000 messages · Apple M4 · warm cache · 6 runs each

query                    matches   rows shown   time
invoice                  ~2,500    500          7.1 – 7.5 ms
budget meeting           246       246          13.4 – 14.1 ms
update 4999              15        15           13.5 – 14.0 ms
会議 (Japanese)         1,529     500          4.3 – 4.6 ms
last 7 days, no words    1,008     500          1.0 ms

first index build        11 s      (10.9 – 11.9 s)
index size on disk       225 MB
status check             5 ms

Dalla tabella vale la pena ricavare due cose. Primo, il tempo non dipende dal numero di corrispondenze: 15 risultati hanno richiesto più di 2.500, perché a costare tempo è la forma della query (una frase di due parole richiede più lavoro di una parola singola), non la quantità di posta che torna indietro. Secondo, l’elenco mostra al massimo le 500 corrispondenze più recenti e lo dice quando ce ne sono di più, quindi disegnare i risultati è un lavoro limitato, qualunque sia il numero di messaggi trovati.

Risultati di ricerca di MailVault per la parola invoice in un archivio di 50.000 messaggi. Sotto il campo di ricerca, l’intestazione indica che l’elenco mostra i 500 più recenti di circa 2.500 risultati salvati in tutte le cartelle, sopra un elenco di righe di messaggi.
Lo stesso tipo di ricerca nell’app: «invoice» su un archivio di 50.000 messaggi. L’elenco mostra i 500 più recenti di circa 2.500 risultati salvati e lo dichiara. Le poche righe in alto vengono dalle caselle demo che condividono questa finestra, e le cartelle dell’archivio si chiamano Projects, Correspondence e Clients invece di quelle del benchmark.
Search time per query on 50,000 messages, in milliseconds Five bars: last 7 days with no words 1.0 ms, Japanese query 4.5 ms, invoice 7.4 ms, budget meeting 14.0 ms, update 4999 14.0 ms. Every bar ends before the 16.7 ms mark, which is one screen refresh at 60 Hz. 0 5 10 15 20 milliseconds, search plus building the result rows last 7 days, no words 1 ms 会議 (Japanese) 4.5 ms invoice 7.4 ms budget meeting 14 ms update 4999 14 ms one 60 Hz screen refresh: 16.7 ms
Tempo di ricerca per query su 50.000 messaggi. Ogni barra termina prima del successivo aggiornamento dello schermo a 60 Hz.

Il costo una tantum è la costruzione dell’indice: circa undici secondi per 50.000 messaggi, circa 4.000 messaggi al secondo, e 225 MB di disco. Avviene in background, puoi continuare a usare MailVault mentre procede, e dopo vengono indicizzati solo i messaggi nuovi e modificati.

MailVault, Impostazioni, scheda Archiviazione, scheda Indice di ricerca con 50.000 / 50.000 indicizzati e circa 270 MB, con interruttori per il corpo dei messaggi, il testo degli allegati e il testo nelle immagini.
Impostazioni, Archiviazione, Indice di ricerca a costruzione ultimata: 50.000 messaggi su 50.000 indicizzati, circa 270 MB su disco. È un’esecuzione separata nell’app, quindi la dimensione differisce dai 225 MB della tabella del benchmark qui sopra.

Come si sentono 1 ms e 7 ms

I millisecondi sono difficili da immaginare, quindi ecco un righello. Un display a 60 Hz ridisegna lo schermo ogni 16,7 ms, e perfino la ricerca più lenta qui ha finito entro un singolo ridisegno. La ricerca sull’usabilità usa gli stessi tre limiti dal 1993: sotto 0,1 secondi sembra istantaneo, fino a 1 secondo il filo dei pensieri resta intatto, e a 10 secondi l’attenzione è sparita. Quattordici millisecondi sono circa un settimo del limite dell’«istantaneo». Il filtro per data, con 1 ms, è cento volte sotto.

How long is a millisecond? Search times on a logarithmic time scale A logarithmic ruler from 1 millisecond to 100 seconds. MailVault search sits between 1 and 14 milliseconds, close to one screen refresh at 16.7 milliseconds and far below the 100 millisecond point at which a response feels instant. The old file-by-file search projected to 88 seconds on a 20,000-message folder. 1 ms 10 ms 100 ms 1 s 10 s 100 s MailVault search on 50,000 messages: 1 to 14 ms one screen refresh 16.7 ms at 60 Hz feels instant under 100 ms flow of thought up to 1 s attention lost after 10 s old search 88 s (projected)
Tempo su scala logaritmica, da 1 millisecondo a 100 secondi. Ogni tacca vale dieci volte la precedente. Limiti di risposta: Jakob Nielsen. Il punto a 88 s è la stima della ricerca originale file per file su una cartella da 20.000 messaggi.

Posta del server, archivio e backup: un’unica ricerca

Risultati di ricerca di MailVault per una query, con la legenda in basso che spiega i contrassegni solo sul server, nel tuo vault, unica copia e sul disco di backup
Ogni risultato indica dove si trova il messaggio: solo sul server, nel tuo vault, unica copia oppure sul tuo disco di backup.

MailVault tiene affiancati tre tipi di posta: i messaggi sincronizzati dal tuo server, quelli che hai archiviato e quelli ripristinati da un backup. Finiscono tutti come file nello stesso vault, quindi finiscono tutti nello stesso indice. Nel test la posta stava in una cartella Inbox, una Archive e una Sent, e una sola query le ha coperte tutte. Da dove arriva un messaggio non cambia la velocità con cui viene trovato.

La posta che si trova solo sul server e non è mai stata scaricata non è nel vault, quindi l’indice locale non può conoscerla. Per questo MailVault interroga anche il server, e i risultati locali indicizzati compaiono per primi mentre il server risponde. Quel tratto dipende dal tuo provider, quindi non pubblichiamo alcun numero. Premium può cercare fino a cinque caselle server contemporaneamente invece di una.

Il disco di backup esterno è una seconda copia, fredda. La ricerca gira sul tuo vault di lavoro, e i risultati sono contrassegnati quando esiste una copia anche sul disco di backup.

La tecnologia: un database SQL molto veloce e molto semplice

Non c’è alcun server di ricerca e nessun servizio cloud. L’indice è un unico file SQLite dentro il tuo vault, e SQLite è probabilmente il database più diffuso al mondo. MailVault usa il suo motore di ricerca full-text, FTS5, con un tokenizzatore trigram: ogni parola viene memorizzata come pezzetti sovrapposti di tre lettere. Ecco perché puoi digitare «voic» e trovare «invoice», senza caratteri jolly e senza regole sulla parola esatta. Gli accenti vengono ignorati, quindi «reunion» trova «Réunion». Giapponese e cinese, che non usano spazi tra le parole, passano per una seconda tabella pensata apposta.

La velocità nasce da tre scelte semplici:

  • La ricerca non apre mai un file di messaggio. Tutto ciò che serve all’elenco (mittente, oggetto, data, cartella, flag) è memorizzato nella riga dell’indice. Durante il test con 50.000 messaggi il parser della posta non è stato chiamato nemmeno una volta mentre venivano costruiti i risultati.
  • Un file, un processo. L’indice appartiene all’helper in background di MailVault, viene aperto una sola volta e tenuto pronto. Non c’è niente da avviare e niente da inviare su una rete.
  • Il tuo disco resta la fonte di verità. L’indice è un dato derivato. Se dovesse mai danneggiarsi, MailVault lo ricostruisce dai messaggi che hai salvato e non tocca mai i messaggi stessi.

Funziona offline e niente lascia il tuo computer.

Allegati e immagini (Premium)

La ricerca gratuita copre mittenti, oggetti e corpo dei messaggi. Premium aggiunge il testo dentro gli allegati, nello stesso indice e nella stessa casella di ricerca:

  • Testo degli allegati. I file PDF, Word, Excel e PowerPoint vengono letti e il loro testo viene indicizzato, così cercando un numero di contratto trovi il messaggio il cui PDF lo contiene.
  • Testo di immagini e scansioni su macOS. MailVault usa il framework Vision di Apple sul tuo Mac per riconoscere il testo in foto, schermate e pagine scansionate, poi lo indicizza. Il riconoscimento avviene sul dispositivo. Windows e Linux non hanno questo passaggio.

Un risultato che esiste solo dentro un allegato è contrassegnato da una graffetta, così capisci perché è comparsa un’email con un corpo poco significativo. In questo test non abbiamo cronometrato l’estrazione dagli allegati: dipende dai tuoi file e viene eseguita una volta per allegato in background, non al momento della ricerca.

Come gli altri client descrivono la propria ricerca

Non abbiamo misurato altre app di posta, e nessuna di quelle qui sotto pubblica tempi di ricerca a 50.000 messaggi, quindi questo è un confronto tra progetti, non tra cronometri:

  • Apple Mail: Apple afferma che la prima indicizzazione di Spotlight può richiedere ore o addirittura giorni, a seconda della quantità di dati, e che Mail può mostrare un avviso che l’indicizzazione non è ancora completa.
  • Outlook per Windows usa l’indice di Windows Search, e Microsoft segnala che i risultati possono essere incompleti finché l’indicizzazione non termina, che viene indicizzata solo la posta in cache locale e che gli elementi più vecchi possono essere nascosti quando una ricerca restituisce troppi risultati.
  • Thunderbird mantiene un indice globale nel proprio database. Il suo bug tracker contiene segnalazioni di lunga data di indicizzazione che rallenta sulle caselle di grandi dimensioni, compreso un utente che ha riferito diversi giorni per 36.000 messaggi. Sono segnalazioni di utenti su hardware datato e non sono direttamente confrontabili con il nostro test.

La nostra scelta progettuale è l’opposto di quella abituale: indicizziamo la tua copia salvata, la teniamo in un unico piccolo file, e manteniamo il percorso della query abbastanza breve da misurare la risposta in millisecondi.

Che cosa questo test non mostra

La casella è sintetica. La posta reale ha messaggi più grandi e più disordinati, quindi l’indice sarà più grande per te se i tuoi corpi sono lunghi, anche se una query percorre comunque l’indice e non i tuoi file. I tempi sono a cache calda: la prima ricerca dopo un riavvio legge di più dal disco. Il test copre oggetti, mittenti e corpi, non il testo degli allegati, ed è stato eseguito su una sola macchina.

Puoi ripetere la misurazione da solo: il benchmark è il test Rust ignorato search_index_bench_50k_real_parser nel codice sorgente di MailVault, e stampa tutti i numeri qui sopra.

Trova in millisecondi l’email di sei anni fa.

MailVault tiene un indice di ricerca privato accanto al tuo archivio, così cercare tra 50.000 messaggi è facile come cercare tra 500. Uso gratuito. La ricerca negli allegati e nelle immagini è inclusa in Premium.

Fonti: Apple Support, indicizzazione di Spotlight; Microsoft Support, problemi di ricerca in Outlook; Mozilla Bugzilla 585429. Benchmark misurato il 21 settembre 2026.