Skip to content
← Voltar ao blog

Pesquisando 50.000 e-mails em milissegundos: como funciona o índice local do MailVault

7 min de leitura

Digite uma palavra no MailVault e as correspondências mais recentes já estão na tela antes mesmo de você soltar a tecla. Para confirmar que isso continua valendo quando uma caixa de correio é realmente grande, montamos um cofre com 50.000 mensagens e cronometramos a pesquisa. A consulta mais lenta que rodamos levou 14 milissegundos.

Este artigo traz os números reais, o que foi medido e o que não foi, e a tecnologia por trás deles: um banco de dados SQL pequeno e simples que fica dentro do seu cofre.

O teste

Geramos 50.000 mensagens de cerca de 3.3 KB cada, no formato multipart com HTML e texto simples que os e-mails reais têm. Elas foram distribuídas em três pastas (Caixa de entrada, Arquivo e Enviados, cerca de um terço em cada) com palavras conhecidas plantadas em taxas conhecidas: “invoice” em 5% das mensagens, “budget” em 8%, “meeting” em 6%, além de palavras em japonês e com acentos para exercitar a pesquisa em outros idiomas. Cada mensagem passou pelo analisador MIME e pelo código de índice reais do MailVault, em uma build de release.

A máquina era um Mac mini Apple M4 com 16 GB de memória. Ela não estava ociosa: outras builds estavam rodando nela durante os testes, então trate os tempos como o que você obtém em um computador ocupado. Cada consulta rodou seis vezes, três em uma build de teste da correção e três no código já integrado. Os números abaixo são a faixa entre essas execuções, e cada tempo cobre a pesquisa mais a montagem das linhas de resultado que você vê na lista.

Os resultados

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

Vale extrair duas coisas dessa tabela. Primeiro, o tempo não está ligado ao número de correspondências: 15 resultados levaram mais tempo que 2.500, porque o que custa tempo é o formato da consulta (uma frase de duas palavras dá mais trabalho que uma palavra só), e não a quantidade de e-mails devolvidos. Segundo, a lista mostra no máximo as 500 correspondências mais recentes e avisa quando há mais, então desenhar os resultados é um trabalho limitado, não importa quantas mensagens correspondam.

Resultados de busca do MailVault para a palavra invoice em um cofre de 50.000 mensagens. Abaixo do campo de busca, o cabeçalho informa que a lista mostra as 500 mais recentes de cerca de 2.500 correspondências salvas em todas as pastas, acima de uma lista de linhas de mensagens.
O mesmo tipo de busca no app: “invoice” em um cofre de 50.000 mensagens. A lista mostra as 500 mais recentes de cerca de 2.500 correspondências salvas e informa isso. As poucas linhas do topo vêm das caixas de demonstração que dividem esta janela, e as pastas do cofre se chamam Projects, Correspondence e Clients, e não as do 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 de pesquisa por consulta em 50.000 mensagens. Todas as barras terminam antes da próxima atualização de tela a 60 Hz.

O custo único é construir o índice: cerca de onze segundos para 50.000 mensagens, aproximadamente 4.000 mensagens por segundo, e 225 MB de disco. Isso acontece em segundo plano, você pode continuar usando o MailVault enquanto ele roda, e depois disso só as mensagens novas e alteradas são indexadas.

MailVault, Configurações, aba Armazenamento, cartão Índice de busca mostrando 50.000 / 50.000 indexadas e cerca de 270 MB, com interruptores para o corpo das mensagens, o texto dos anexos e o texto em imagens.
Configurações, Armazenamento, Índice de busca depois de concluída a construção: 50.000 de 50.000 mensagens indexadas, cerca de 270 MB em disco. É uma execução separada no app, por isso o tamanho difere dos 225 MB da tabela do benchmark acima.

Como são 1 ms e 7 ms

Milissegundos são difíceis de imaginar, então aqui vai uma régua. Uma tela de 60 Hz se redesenha a cada 16.7 ms, e até a pesquisa mais lenta daqui terminou dentro de um único redesenho. A pesquisa de usabilidade usa os mesmos três limites desde 1993: abaixo de 0.1 segundo parece instantâneo, até 1 segundo mantém o fio do pensamento e, aos 10 segundos, a atenção já se foi. Quatorze milissegundos é cerca de um sétimo do limite de “instantâneo”. O filtro de data, com 1 ms, fica cem vezes abaixo dele.

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 em escala logarítmica, de 1 milissegundo a 100 segundos. Cada marca vale dez vezes a anterior. Limites de tempo de resposta: Jakob Nielsen. O ponto de 88 s é a projeção da pesquisa original, arquivo por arquivo, em uma pasta de 20.000 mensagens.

E-mail do servidor, arquivo e backup: uma só pesquisa

Resultados de pesquisa do MailVault para uma consulta, com a legenda na parte inferior explicando os marcadores só no servidor, no seu cofre, única cópia e na unidade de backup
Cada resultado diz onde a mensagem está: só no servidor, no seu cofre, a única cópia, ou na sua unidade de backup.

O MailVault mantém três tipos de e-mail lado a lado: mensagens sincronizadas do seu servidor, mensagens que você arquivou e mensagens restauradas de um backup. Todas acabam como arquivos no mesmo cofre, então todas entram no mesmo índice. No teste, o e-mail ficou em uma pasta Caixa de entrada, uma Arquivo e uma Enviados, e uma única consulta cobriu tudo. De onde a mensagem veio não muda a velocidade com que ela é encontrada.

O e-mail que está só no servidor e nunca foi baixado não está no cofre, então o índice local não tem como conhecê-lo. Para esse caso, o MailVault também consulta o servidor, e os resultados locais indexados aparecem primeiro enquanto o servidor responde. Essa etapa depende do seu provedor, então não publicamos número para ela. O Premium pode pesquisar até cinco caixas do servidor ao mesmo tempo, em vez de uma.

A unidade de backup externa é uma segunda cópia, fria. A pesquisa roda no seu cofre de trabalho, e os resultados são marcados quando existe também uma cópia na unidade de backup.

A tecnologia: um banco de dados SQL muito rápido e muito simples

Não há servidor de pesquisa nem serviço na nuvem. O índice é um único arquivo SQLite dentro do seu cofre, e o SQLite é provavelmente o banco de dados mais amplamente usado do mundo. O MailVault usa o mecanismo de pesquisa em texto completo dele, o FTS5, com um tokenizador trigram: cada palavra é armazenada como pedaços sobrepostos de três letras. É por isso que você pode digitar “voic” e encontrar “invoice”, sem curingas e sem regras de palavra exata. Os acentos são ignorados na comparação, então “reunion” encontra “Réunion”. Japonês e chinês, que não usam espaços entre as palavras, passam por uma segunda tabela feita para eles.

A velocidade vem de três decisões simples:

  • A pesquisa nunca abre um arquivo de mensagem. Tudo o que a lista precisa (remetente, assunto, data, pasta, marcadores) fica guardado na linha do índice. Durante o teste com 50.000 mensagens, o analisador de e-mail foi chamado zero vezes enquanto os resultados eram montados.
  • Um arquivo, um processo. O índice pertence ao auxiliar em segundo plano do MailVault, é aberto uma vez e mantido pronto para uso. Não há nada para iniciar e nada para enviar por uma rede.
  • Seu disco continua sendo a fonte da verdade. O índice é um dado derivado. Se um dia ele for danificado, o MailVault o reconstrói a partir das suas mensagens salvas e nunca mexe nas mensagens em si.

Funciona offline, e nada sai do seu computador.

Anexos e imagens (Premium)

A pesquisa gratuita cobre remetentes, assuntos e corpos de mensagem. O Premium acrescenta o texto dentro dos anexos, no mesmo índice e na mesma caixa de pesquisa:

  • Texto de anexos. Arquivos PDF, Word, Excel e PowerPoint são lidos e o texto deles é indexado, então uma pesquisa por um número de contrato encontra a mensagem cujo PDF o contém.
  • Texto de imagens e digitalizações no macOS. O MailVault usa o framework Vision da Apple no seu Mac para reconhecer texto em fotos, capturas de tela e páginas digitalizadas, e depois o indexa. O reconhecimento roda no próprio dispositivo. Windows e Linux não têm essa etapa.

Um resultado que existe só dentro de um anexo é marcado com um clipe de papel, para você saber por que um e-mail com um corpo sem nada de especial apareceu. Não cronometramos a extração de anexos neste teste: ela depende dos seus arquivos e roda uma vez por anexo em segundo plano, não no momento da pesquisa.

Como outros clientes descrevem a pesquisa deles

Não fizemos benchmark de outros aplicativos de e-mail, e nenhum dos abaixo publica tempos de pesquisa com 50.000 mensagens, então isto é uma comparação de projetos, não de cronômetros:

  • Apple Mail: a Apple diz que a primeira indexação do Spotlight pode levar horas ou até dias, dependendo da quantidade de dados, e que o Mail pode mostrar um aviso de que a indexação ainda está incompleta.
  • O Outlook para Windows usa o índice do Windows Search, e a Microsoft observa que os resultados podem ficar incompletos até a indexação terminar, que só o e-mail em cache local é indexado e que itens mais antigos podem ficar ocultos quando uma pesquisa retorna resultados demais.
  • O Thunderbird mantém um índice global em seu próprio banco de dados. O rastreador de bugs dele tem relatos antigos de indexação ficando lenta em caixas de correio grandes, incluindo um usuário que relatou vários dias para 36.000 mensagens. São relatos de usuários em hardware mais antigo e não são diretamente comparáveis ao nosso teste.

Nossa escolha de projeto é o oposto da usual: indexamos a sua própria cópia salva, a mantemos em um único arquivo pequeno e deixamos o caminho da consulta curto o bastante para que a resposta seja medida em milissegundos.

O que este teste não mostra

A caixa de correio é sintética. E-mails reais têm mensagens maiores e mais bagunçadas, então o índice será maior para você se os corpos forem longos, embora uma consulta ainda percorra o índice, não os seus arquivos. Os tempos são com cache aquecido: a primeira pesquisa depois de uma reinicialização lê mais do disco. O teste cobre assuntos, remetentes e corpos, não texto de anexos, e foi rodado em uma única máquina.

Você pode repetir a medição por conta própria: o benchmark é o teste em Rust ignorado search_index_bench_50k_real_parser na árvore de código-fonte do MailVault, e ele imprime todos os números acima.

Encontre em milissegundos o e-mail de seis anos atrás.

O MailVault mantém um índice de pesquisa privado ao lado do seu arquivo, então pesquisar 50.000 mensagens é tão fácil quanto pesquisar 500. Uso gratuito. A pesquisa em anexos e imagens vem com o Premium.

Fontes: Suporte da Apple, indexação do Spotlight; Suporte da Microsoft, problemas de pesquisa do Outlook; Mozilla Bugzilla 585429. Benchmark medido em 21 de setembro de 2026.