Per prima cosa, confrontiamo le mele con le mele:Le letture e le scritture con MongoDB sono come le letture e le scritture singole per chiave primaria su una tabella senza indici non cluster in un RDBMS.
Quindi consente di confrontare esattamente questo:http://mysqlha.blogspot.de/2010/09/mysql-versus-mongodb-yet-another-silly.html
E si scopre che la differenza di velocità in un confronto equo della stessa operazione primitiva non è grande. In effetti, MySQL è leggermente più veloce. Direi che sono equivalenti.
Come mai? Perché in realtà, entrambi i sistemi stanno facendo cose simili in questo particolare benchmark. Restituire una singola riga, ricercata dalla chiave primaria, in realtà non è molto lavoro. È un'operazione molto veloce. Sospetto che le spese generali di comunicazione tra processi ne siano una parte importante.
La mia ipotesi è che il codice più ottimizzato in MySQL superi gli overhead leggermente meno sistematici di MongoDB (nessun blocco logico e probabilmente altre piccole cose).
Questo porta a una conclusione interessante:Puoi utilizzare MySQL come un database di documenti e ottenere prestazioni eccellenti da esso.
Se l'intervistatore dicesse:"Non ci interessano documenti o stili, abbiamo solo bisogno di un database molto più veloce, pensi che dovremmo usare MySQL o MongoDB?", cosa risponderei?
Consiglierei di ignorare le prestazioni per un momento e guardare la forza relativa dei due sistemi. Per MongoDB vengono in mente cose come il ridimensionamento (verso l'alto) e la replica. Per MySQL, ci sono molte più funzionalità come query avanzate, modelli di concorrenza, strumenti e maturità migliori e molto altro.
Fondamentalmente, puoi scambiare funzionalità per prestazioni. Sono disposti a farlo? Questa è una scelta che non può essere fatta in generale. Se opti per le prestazioni a qualsiasi costo, considera l'ottimizzazione di MySQL prima di aggiungere un'altra tecnologia.
Ecco cosa succede quando un client recupera una singola riga/documento tramite la chiave primaria. Annoterò le differenze tra i due sistemi:
- Il client crea un comando binario (lo stesso)
- Il client lo invia su TCP (stesso)
- Il server analizza il comando (stesso)
- Il server accede al piano di query dalla cache (solo SQL, non MongoDB, non HandlerSocket)
- Il server chiede al componente B-Tree di accedere alla riga (stessa)
- Il server esegue un blocco fisico di sola lettura sul percorso B-Tree che porta alla riga (uguale)
- Il server accetta un blocco logico sulla riga (solo SQL, non MongoDB, non HandlerSocket)
- Il server serializza la riga e la invia su TCP (stesso)
- Il client lo deserializza (uguale)
Ci sono solo due passaggi aggiuntivi per i tipici RDBMS basati su SQL. Ecco perché non c'è davvero alcuna differenza.