Banco de Dados

30 jun, 2010

MongoDB vs CouchDB – por que escolhi o MongoDB

Publicidade

Aposto todas as minhas fichinhas
que todos que quiseram estudar NoSQL ficaram na dúvida de qual dos
dois usar, MongoDB ou CouchDB, mesmo que tenha ido para um Cassandra ou
qualquer outro NoSQL.

A dúvida fica muito maior porque são
dois bancos de dados muito semelhantes (orientados a documentos) e
bastante usados. Vou colocar aqui o meu relato sobre o MongoDB e o
CouchDB.

CouchDB

Quando vi as possibilidades do
NoSQL, o primeiro banco de dados que vi foi o CouchDB e fiquei louco
para começar a aprendê-lo, a fazer alguns projetos e tudo mais. Porém dei uma olhada muito rápida no site deles e não vi uma versão pra
Windows. Falem o que quiserem, mas muita, muita gente – e todo mundo sabe
disso – faz tudo no Windows e, se não tiver uma versão pra ele, não vão
usar, vão continuar com o MySQL.

Demorei meses para voltar para o
NoSQL, mas sempre com aquela vontade de realmente aprender um desses
novos bancos de dados. Voltando àquele tesão inicial em aprender o
NoSQL, vi muitos códigos usando o CouchDB, muita gente usando, muitas
coisas pela internet sobre ele. Isso foi um ponto forte pra mim em
relação a outros e, quando vi que o CouchDB era incubado pela Apache, a
balança pesou mais um pouquinho.

Já que o NoSQL é uma tecnologia
extremamente nova, eu queria pensar a longo prazo. Várias vezes fiquei
me perguntando as vantagens entre esses BDs. Confesso que,
quando vi uma pesquisa falando sobre os bancos de dados que as pessoas
mais tinham vontade de aprender, apontando o CouchDB como segundo, ele
ganhou mais um ponto. O primeiro da lista era o Cassandra, porém ele ainda
não tinha instalação pra Windows. O PHP é muito forte, e um dos fatores
principais é a grande comunidade e excelente documentação que eles
possuem, levei isso em consideração na hora da escolha do NoSQL.

O CouchDB vinha cada vez mais
ganhando pontos comigo. Mas, na mesma pesquisa, o terceiro colocado era o
MongoDB, e então eu resolvi olhá-lo mais de perto, uma vez que queria dar o
pontapé inicial.

MongoDB

Cheguei para olhar o MongoDB só por
olhar mesmo, só para ir pro CouchDB com a consciência limpa. Lia alguma
coisa sobre ele e pensava “mas o CouchDB faz isso também”.

Mas uma
coisa começou a me chamar a atenção: para instalar o MongoDB, era só
baixar no site e extrair em algum diretório. Isso me chamou a atenção, porque o CouchDB precisava de algumas dependências para rodar. Então, eu baixei e instalei o MongoDB e naquele momento comecei a pensar mais sobre ele, um
coraçãozinho cresceu.

Rodei uma linha de comando, e está
lá, um NoSQL funcionando direitinho. Isso foi tão empolgante que não
achava que pudesse melhorar, mas olhei no site do MongoDB e para rodar com
o PHP bastava instalar uma DLL. Fui lá e instalei a dll.

A facilidade me encantou, porém ainda
pesava a incubadora do CouchDB e todos os outros pontos. Analisando
mais um pouco o CouchDB, vi que eram precisos vários includes para faze-lo funcionar com PHP: menos pontos pra ele, uma vez que o MongoDB se
saiu muito bem nessa.

Próximo passo foi colocar lado a lado a documentação

Não precisei olhar muito para saber o
escolhido: na imensa documentação do php.net está uma documentação
para o MongoDB. Foi ali que parei de ler o CouchDB e comecei a ler sobre o
MongoDB.

MongoDB funcionando na minha máquina, documentação no php.net,
documentação no próprio site do MongoDB… era incrível! A partir daí, não tive mais
tempo para o CouchDB.

Benchmark

Felix Geisendörfer fez uma referência em PHP,
que foi super-fácil para portar para MongoDB. Seu benchmark diz
respeito à inserção dos dados, e não sobre consultas e atualizações.

Comparando seus resultados para CouchDB com o meu para MongoDB
(tempo em ms):

Como você pode ver, o MongoDB é um
pouco melhor. Aqui estão os números:

N º de inserções Couch Tempo Total (seg) Couch / Doc (ms) Mongo Tempo Total (seg) Mongo / Doc (ms)
1 0,0015 1,46 0,0005 0,5
2 0,0015 0,75 0,0004 0,2096
3 0,0017 0,56 0,0005 0,1604
4 0,0017 0,44 0,0005 0,1190
5 0,0018 0,36 0,0005 0,1060
6 0,0019 0,32 0,0006 0,0931
7 0,0021 0,3 0,0006 0,0847
8 0,0022 0,27 0,0007 0,0789
9 0,0023 0,25 0,0007 0,0734
10 0,0025 0,25 0,0007 0,0721
50 0,007 0,14 0,0024 0,0476
100 0,0136 0,14 0,0044 0,0442
500 0,0687 0,14 0,0253 0,0505
1000 0,1361 0,14 0,0372 0,0372
2500 0,4686 0,19 0,0278 0,0372
5000 0,9165 0,18 0,0488 0,0371
7500 1,5116 0,2 0,0835 0,0098
10000 2,3111 0,23 0,1065 0,0111
25000 6,8684 0,27 0,2711 0,0107
50000 15,8227 0,32 0,5430 0,0109
100000 35,3071 0,35 1,7697 0,0177
250000 104.0009 0,42 6,4533 0,0258
500000 230.6021 0,46 11,7684 0,0235
750000 352.7959 0,47 17,0473 0,0227
1000000 487.3284 0,49 18,4376 0,0184

Analisando os dados do gráfico e da tabela podemos perceber que o
tempo real do MongoDB quase sempre está uma casa decimal abaixo do
CouchDB, ou seja, enquanto o CouchDB demora 0,0025, o Mongo DB, para o
mesmo conjunto de instruções, demora 0,0007 segundos. E por conseguinte
notamos que, no final da inserção de 1 milhão de registros, o CouchDB
demora 487.3284 e o MongoDB 18,4376 segundos no total. É um tempo
considerável.

Conclusão

Posso ter puxado o saco do MongoDB,
mas a facilidade de instalação, sem dependências nem nada – só instalar
uma dll no meu php e rodar -, foi fator decisivo. No meio do caminho da
comparação, o processo foi tão simples que parei por ali. Ao ver a
documentação do php.net, vi que ali o MongoDB tinha o apoio que eu
esperava.

Apesar de muitas pessoas estarem entrando no NoSQL e indo
direto pro CouchDB, o MongoDB tem uma comunidade bastante forte, a
facilidade dele como um todo é incrível, isso conta muitos pontos.

Eu escolhi o MongoDB, mas vou
estudar o CouchDB e o Cassandra. Eles são tão fáceis que quero
aprender, nem que seja um pouco de cada um deles, mas estou estudando a
fundo mesmo o MongoDB.