Tout d'abord, comparons des pommes avec des pommes :Les lectures et les écritures avec MongoDB sont comme des lectures et des écritures uniques par clé primaire sur une table sans index non clusterisés dans un SGBDR.
Alors comparons exactement cela :http://mysqlha.blogspot.de/2010/09/mysql-versus-mongodb-yet-another-silly.html
Et il s'avère que la différence de vitesse dans une comparaison équitable d'exactement la même opération primitive n'est pas grande. En fait, MySQL est légèrement plus rapide. Je dirais qu'ils sont équivalents.
Pourquoi? Parce qu'en fait, les deux systèmes font des choses similaires dans ce benchmark particulier. Le retour d'une seule ligne, recherchée par clé primaire, n'est en fait pas beaucoup de travail. C'est une opération très rapide. Je soupçonne que les frais généraux de communication inter-processus en sont une grande partie.
Je suppose que le code le plus optimisé de MySQL l'emporte sur les frais généraux légèrement moins systématiques de MongoDB (pas de verrous logiques et probablement d'autres petites choses).
Cela conduit à une conclusion intéressante :Vous pouvez utiliser MySQL comme une base de données de documents et en tirer d'excellentes performances.
Si l'intervieweur disait :"Nous ne nous soucions pas des documents ou des styles, nous avons juste besoin d'une base de données beaucoup plus rapide, pensez-vous que nous devrions utiliser MySQL ou MongoDB ?", que répondrais-je ?
Je recommanderais de ne pas tenir compte des performances pendant un moment et de regarder la force relative des deux systèmes. Des choses comme la mise à l'échelle (vers le haut) et la réplication viennent à l'esprit pour MongoDB. Pour MySQL, il y a beaucoup plus de fonctionnalités comme des requêtes riches, des modèles de concurrence, de meilleurs outils et une meilleure maturité et bien plus encore.
Fondamentalement, vous pouvez échanger des fonctionnalités contre des performances. Êtes-vous prêt à le faire ? C'est un choix qui ne peut pas être fait de manière générale. Si vous optez pour les performances à tout prix, envisagez de régler MySQL avant d'ajouter une autre technologie.
Voici ce qui se passe lorsqu'un client récupère une seule ligne/document par clé primaire. Je vais annoter les différences entre les deux systèmes :
- Le client construit une commande binaire (identique)
- Le client l'envoie via TCP (identique)
- Le serveur analyse la commande (idem)
- Le serveur accède au plan de requête à partir du cache (SQL uniquement, pas MongoDB, pas HandlerSocket)
- Le serveur demande au composant B-Tree d'accéder à la ligne (idem)
- Le serveur prend un verrou physique en lecture seule sur le chemin B-Tree menant à la ligne (identique)
- Le serveur prend un verrou logique sur la ligne (SQL uniquement, pas MongoDB, pas HandlerSocket)
- Le serveur sérialise la ligne et l'envoie via TCP (identique)
- Le client le désérialise (idem)
Il n'y a que deux étapes supplémentaires pour les SGBDR typiques basés sur SQL. C'est pourquoi il n'y a pas vraiment de différence.