Lad os først sammenligne æbler med æbler:Læsninger og skrivninger med MongoDB er som enkelte læsninger og skrivninger med primærnøgle på en tabel uden ikke-klyngede indekser i en RDBMS.
Så lad os benchmarke præcis det:http://mysqlha.blogspot.de/2010/09/mysql-versus-mongodb-yet-another-silly.html
Og det viser sig, at hastighedsforskellen i en rimelig sammenligning af nøjagtig den samme primitive operation ikke er stor. Faktisk er MySQL lidt hurtigere. Jeg vil sige, at de er ækvivalente.
Hvorfor? For faktisk gør begge systemer lignende ting i denne særlige benchmark. At returnere en enkelt række, søgt efter primærnøgle, er faktisk ikke så meget arbejde. Det er en meget hurtig operation. Jeg har en mistanke om, at kommunikationsomkostninger på tværs af processer er en stor del af det.
Mit gæt er, at den mere tunede kode i MySQL opvejer de lidt mindre systematiske omkostninger ved MongoDB (ingen logiske låse og sikkert nogle andre småting).
Dette fører til en interessant konklusion:Du kan bruge MySQL som en dokumentdatabase og få fremragende ydeevne ud af det.
Hvis intervieweren sagde:"Vi er ligeglade med dokumenter eller stilarter, vi har bare brug for en meget hurtigere database, synes du, vi skal bruge MySQL eller MongoDB?", hvad ville jeg svare?
Jeg vil anbefale at se bort fra ydeevne et øjeblik og se på den relative styrke af de to systemer. Ting som skalering (vej op) og replikering kommer til at tænke på for MongoDB. For MySQL er der mange flere funktioner såsom omfattende forespørgsler, samtidighedsmodeller, bedre værktøj og modenhed og meget mere.
Grundlæggende kan du bytte funktioner til ydeevne. Er du villig til at gøre det? Det er et valg, der ikke kan træffes generelt. Hvis du vælger ydeevne for enhver pris, bør du overveje at tune MySQL først, før du tilføjer en anden teknologi.
Her er, hvad der sker, når en klient henter en enkelt række/dokument med primærnøgle. Jeg vil kommentere forskellene mellem begge systemer:
- Klienten bygger en binær kommando (samme)
- Kunden sender det over TCP (samme)
- Serveren analyserer kommandoen (samme)
- Serveren tilgår forespørgselsplan fra cache (kun SQL, ikke MongoDB, ikke HandlerSocket)
- Server beder B-Tree-komponenten om at få adgang til rækken (samme)
- Serveren tager en fysisk skrivebeskyttet lås på B-Tree-stien, der fører til rækken (samme)
- Serveren tager en logisk lås på rækken (kun SQL, ikke MongoDB, ikke HandlerSocket)
- Serveren serialiserer rækken og sender den over TCP (samme)
- Kunden deserialiserer det (samme)
Der er kun to yderligere trin for typiske SQL-baserede RDBMS'er. Derfor er der ikke rigtig nogen forskel.