Laten we eerst appels met appels vergelijken:Lezen en schrijven met MongoDB zijn als enkele lees- en schrijfbewerkingen met de primaire sleutel op een tabel zonder niet-geclusterde indexen in een RDBMS.
Dus laten we precies dat benchmarken:http://mysqlha.blogspot.de/2010/09/mysql-versus-mongodb-yet-another-silly.html
En het blijkt dat het snelheidsverschil in een eerlijke vergelijking van precies dezelfde primitieve operatie niet groot is. MySQL is zelfs iets sneller. Ik zou zeggen, ze zijn gelijkwaardig.
Waarom? Want eigenlijk doen beide systemen vergelijkbare dingen in deze specifieke benchmark. Het retourneren van een enkele rij, doorzocht op primaire sleutel, is eigenlijk niet zo veel werk. Het is een zeer snelle operatie. Ik vermoed dat de overheadkosten voor communicatie tussen processen een groot deel van uitmaken.
Mijn gok is dat de meer afgestemde code in MySQL opweegt tegen de iets minder systematische overheadkosten van MongoDB (geen logische vergrendelingen en waarschijnlijk enkele andere kleine dingen).
Dit leidt tot een interessante conclusie:U kunt MySQL gebruiken als een documentendatabase en er uitstekende prestaties uit halen.
Als de interviewer zei:"We geven niet om documenten of stijlen, we hebben gewoon een veel snellere database nodig, denk je dat we MySQL of MongoDB moeten gebruiken?", wat zou ik dan antwoorden?
Ik zou aanraden om de prestaties even buiten beschouwing te laten en naar de relatieve sterkte van de twee systemen te kijken. Dingen als schalen (helemaal omhoog) en replicatie komen voor de geest voor MongoDB. Voor MySQL zijn er veel meer functies, zoals uitgebreide zoekopdrachten, gelijktijdigheidsmodellen, betere tooling en volwassenheid en nog veel meer.
Kortom, u kunt functies inruilen voor prestaties. Zijn bereid om dat te doen? Dat is een keuze die in het algemeen niet gemaakt kan worden. Als u koste wat kost kiest voor prestaties, overweeg dan eerst MySQL af te stemmen voordat u een andere technologie toevoegt.
Dit is wat er gebeurt als een client een enkele rij/document ophaalt op primaire sleutel. Ik zal de verschillen tussen beide systemen annoteren:
- Client bouwt een binair commando (zelfde)
- Cliënt verzendt het via TCP (zelfde)
- Server ontleedt de opdracht (zelfde)
- Server heeft toegang tot queryplan vanuit cache (alleen SQL, niet MongoDB, niet HandlerSocket)
- Server vraagt B-Tree component om toegang te krijgen tot de rij (zelfde)
- Server neemt een fysieke alleen-lezen-lock op het B-Tree-pad dat naar de rij leidt (zelfde)
- Server neemt een logische vergrendeling op de rij (alleen SQL, niet MongoDB, niet HandlerSocket)
- Server serialiseert de rij en verzendt deze via TCP (zelfde)
- Cliënt deserialiseert het (zelfde)
Er zijn slechts twee extra stappen voor typische op SQL gebaseerde RDBMS'en. Daarom is er niet echt een verschil.