Lassen Sie uns zuerst Äpfel mit Äpfeln vergleichen:Lese- und Schreibvorgänge mit MongoDB sind wie einzelne Lese- und Schreibvorgänge nach Primärschlüssel in einer Tabelle ohne nicht gruppierte Indizes in einem RDBMS.
Lasst uns also genau das Benchmarken:http://mysqlha.blogspot.de/2010/09/mysql-versus-mongodb-yet-another-silly.html
Und es stellt sich heraus, dass der Geschwindigkeitsunterschied bei einem fairen Vergleich genau derselben primitiven Operation nicht groß ist. In der Tat ist MySQL etwas schneller. Ich würde sagen, sie sind gleichwertig.
Wieso den? Denn eigentlich machen beide Systeme in diesem speziellen Benchmark ähnliche Dinge. Das Zurückgeben einer einzelnen Zeile, die nach dem Primärschlüssel gesucht wird, ist eigentlich nicht so viel Arbeit. Es ist eine sehr schnelle Operation. Ich vermute, dass die prozessübergreifenden Kommunikationskosten einen großen Teil davon ausmachen.
Meine Vermutung ist, dass der besser abgestimmte Code in MySQL den etwas weniger systematischen Overhead von MongoDB aufwiegt (keine logischen Sperren und wahrscheinlich einige andere Kleinigkeiten).
Dies führt zu einer interessanten Schlussfolgerung:Sie können MySQL wie eine Dokumentendatenbank verwenden und eine hervorragende Leistung daraus ziehen.
Wenn der Interviewer sagen würde:"Wir kümmern uns nicht um Dokumente oder Stile, wir brauchen nur eine viel schnellere Datenbank, denken Sie, wir sollten MySQL oder MongoDB verwenden?", was würde ich antworten?
Ich würde empfehlen, die Leistung für einen Moment außer Acht zu lassen und die relative Stärke der beiden Systeme zu betrachten. Dinge wie Skalierung (weit nach oben) und Replikation kommen mir für MongoDB in den Sinn. Für MySQL gibt es viel mehr Funktionen wie reichhaltige Abfragen, Parallelitätsmodelle, bessere Tools und Reife und vieles mehr.
Grundsätzlich können Sie Funktionen gegen Leistung eintauschen. Sind Sie dazu bereit? Das ist eine Auswahl, die nicht allgemein getroffen werden kann. Wenn Sie sich für Leistung um jeden Preis entscheiden, erwägen Sie zuerst, MySQL zu optimieren, bevor Sie eine andere Technologie hinzufügen.
Folgendes passiert, wenn ein Client eine einzelne Zeile/ein einzelnes Dokument nach Primärschlüssel abruft. Ich werde die Unterschiede zwischen beiden Systemen kommentieren:
- Client erstellt einen binären Befehl (gleich)
- Client sendet es über TCP (gleich)
- Server parst den Befehl (gleich)
- Server greift auf Abfrageplan aus dem Cache zu (nur SQL, nicht MongoDB, nicht HandlerSocket)
- Server fordert B-Tree-Komponente auf, auf die Zeile zuzugreifen (gleiche)
- Der Server nimmt eine physische Nur-Lese-Sperre auf dem B-Tree-Pfad, der zu der Zeile führt (gleiche)
- Der Server nimmt eine logische Sperre für die Zeile (nur SQL, nicht MongoDB, nicht HandlerSocket)
- Der Server serialisiert die Zeile und sendet sie über TCP (gleich)
- Der Client deserialisiert es (gleich)
Es gibt nur zwei zusätzliche Schritte für typische SQL-basierte RDBMS. Deshalb gibt es keinen wirklichen Unterschied.