Ich war sehr aufgeregt über MongoDb und habe es in letzter Zeit getestet. Ich hatte eine Tabelle namens posts in MySQL mit ungefähr 20 Millionen Datensätzen, die nur in einem Feld namens 'id' indiziert waren.
Ich wollte die Geschwindigkeit mit MongoDB vergleichen und führte einen Test durch, bei dem 15 Datensätze zufällig aus unseren riesigen Datenbanken abgerufen und gedruckt wurden. Ich habe die Abfrage für MySQL und MongoDB jeweils etwa 1.000 Mal ausgeführt und bin überrascht, dass ich keinen großen Geschwindigkeitsunterschied bemerke. Vielleicht ist MongoDB 1,1-mal schneller. Das ist sehr enttäuschend. Gibt es etwas, was ich falsch mache? Ich weiß, dass meine Tests nicht perfekt sind, aber MySQL ist MongoDb ebenbürtig, wenn es darum geht, intensive Aufgaben zu lesen.
Hinweis:
- Ich habe Dual Core + (2 Threads) i7 CPU und 4 GB RAM
- Ich habe 20 Partitionen auf MySQL mit jeweils 1 Million Datensätzen
Beispielcode zum Testen von MongoDB
<?php
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$time_taken = 0;
$tries = 100;
// connect
$time_start = microtime_float();
for($i=1;$i<=$tries;$i++)
{
$m = new Mongo();
$db = $m->swalif;
$cursor = $db->posts->find(array('id' => array('$in' => get_15_random_numbers())));
foreach ($cursor as $obj)
{
//echo $obj["thread_title"] . "<br><Br>";
}
}
$time_end = microtime_float();
$time_taken = $time_taken + ($time_end - $time_start);
echo $time_taken;
function get_15_random_numbers()
{
$numbers = array();
for($i=1;$i<=15;$i++)
{
$numbers[] = mt_rand(1, 20000000) ;
}
return $numbers;
}
?>
Beispielcode zum Testen von MySQL
<?php
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$BASE_PATH = "../src/";
include_once($BASE_PATH . "classes/forumdb.php");
$time_taken = 0;
$tries = 100;
$time_start = microtime_float();
for($i=1;$i<=$tries;$i++)
{
$db = new AQLDatabase();
$sql = "select * from posts_really_big where id in (".implode(',',get_15_random_numbers()).")";
$result = $db->executeSQL($sql);
while ($row = mysql_fetch_array($result) )
{
//echo $row["thread_title"] . "<br><Br>";
}
}
$time_end = microtime_float();
$time_taken = $time_taken + ($time_end - $time_start);
echo $time_taken;
function get_15_random_numbers()
{
$numbers = array();
for($i=1;$i<=15;$i++)
{
$numbers[] = mt_rand(1, 20000000);
}
return $numbers;
}
?>
quelle
Antworten:
MongoDB ist nicht magisch schneller. Wenn Sie dieselben Daten speichern, im Grunde auf dieselbe Weise organisiert sind und genau auf dieselbe Weise darauf zugreifen, sollten Sie wirklich nicht erwarten, dass Ihre Ergebnisse stark voneinander abweichen. Schließlich sind MySQL und MongoDB beide GPL. Wenn Mongo also einen magisch besseren E / A-Code enthält, kann das MySQL-Team ihn einfach in seine Codebasis integrieren.
Die Menschen sehen die Leistung von MongoDB in der realen Welt hauptsächlich, weil Sie mit MongoDB auf eine andere Art und Weise abfragen können, die für Ihre Arbeitslast sinnvoller ist.
Stellen Sie sich zum Beispiel ein Design vor, das auf normalisierte Weise viele Informationen über eine komplizierte Entität enthält. Dies könnte leicht Dutzende von Tabellen in MySQL (oder einer relationalen Datenbank) verwenden, um die Daten in normaler Form zu speichern, wobei viele Indizes erforderlich sind, um die relationale Integrität zwischen Tabellen sicherzustellen.
Betrachten Sie nun das gleiche Design mit einem Dokumentenspeicher. Wenn alle diese zugehörigen Tabellen der Haupttabelle untergeordnet sind (und dies häufig der Fall ist), können Sie die Daten möglicherweise so modellieren, dass die gesamte Entität in einem einzigen Dokument gespeichert wird. In MongoDB können Sie dies als einzelnes Dokument in einer einzelnen Sammlung speichern. Hier beginnt MongoDB, überlegene Leistung zu ermöglichen.
In MongoDB müssen Sie Folgendes ausführen, um die gesamte Entität abzurufen:
Also eine B-Tree-Suche und eine Binärseite lesen. Protokoll (n) + 1 E / A. Wenn sich die Indizes vollständig im Speicher befinden können, dann 1 E / A.
In MySQL mit 20 Tabellen müssen Sie Folgendes ausführen:
Die Summe für MySQL, selbst wenn angenommen wird, dass sich alle Indizes im Speicher befinden (was schwieriger ist, da es 20-mal mehr davon gibt), beträgt ungefähr 20 Bereichssuchen.
Diese Bereichssuchen bestehen wahrscheinlich aus zufälligen E / A-Vorgängen. Verschiedene Tabellen befinden sich definitiv an verschiedenen Stellen auf der Festplatte, und es ist möglich, dass verschiedene Zeilen im gleichen Bereich in derselben Tabelle für eine Entität nicht zusammenhängend sind (abhängig davon, wie die Entität war aktualisiert usw.).
In diesem Beispiel beträgt die endgültige Anzahl etwa 20-mal mehr E / A mit MySQL pro logischem Zugriff als in MongoDB.
Auf diese Weise kann MongoDB in einigen Anwendungsfällen die Leistung steigern .
quelle
Haben Sie Parallelität, dh gleichzeitige Benutzer? Wenn Sie die Abfrage nur 1000 Mal direkt mit nur einem Thread ausführen, gibt es fast keinen Unterschied. Zu einfach für diese Motoren :)
ABER ich empfehle dringend, dass Sie eine echte Lasttestsitzung erstellen, dh einen Injektor wie JMeter mit 10, 20 oder 50 Benutzern gleichzeitig verwenden, damit Sie wirklich einen Unterschied erkennen können (versuchen Sie, diesen Code in eine Webseite JMeter einzubetten könnte abfragen).
Ich habe es heute auf einem einzelnen Server (und einer einfachen Sammlung / Tabelle) gemacht und die Ergebnisse sind sehr interessant und überraschend (MongoDb war beim Schreiben und Lesen wirklich schneller als die MyISAM-Engine und die InnoDb-Engine).
Dies sollte wirklich Teil Ihres Tests sein: Parallelität & MySQL-Engine. Dann sind Daten- / Schemadesign und Anwendungsanforderungen natürlich enorme Anforderungen, die über die Antwortzeiten hinausgehen. Lassen Sie mich wissen, wenn Sie Ergebnisse erhalten, ich brauche auch Eingaben dazu!
quelle
Quelle: https://github.com/webcaetano/mongo-mysql
10 Reihen
100 Zeilen
1000 Zeilen
10.000 Zeilen
quelle
Mann ,,, die Antwort ist, dass Sie im Grunde PHP testen und keine Datenbank.
Machen Sie sich nicht die Mühe, die Ergebnisse zu wiederholen, egal ob Sie den Druck auskommentieren oder nicht. Es gibt ein Stück Zeit.
während der andere Teil damit verbringt, ein paar Rand-Zahlen zu sammeln.
dann gibt es einen großen Unterschied s / w implodieren und in.
und schließlich, was hier los ist. Es sieht so aus, als würde jedes Mal eine Verbindung erstellt, sodass die Verbindungszeit plus die Abfragezeit getestet werden.
vs.
Ihre 101% schnellere Abfrage könnte sich für die zugrunde liegende Abfrage ohne Jazz als 1000% schneller herausstellen.
urghhh.
quelle
https://github.com/reoxey/benchmark
Benchmark
Geschwindigkeitsvergleich von MySQL & MongoDB in GOLANG1.6 & PHP5
System für Benchmark verwendet: DELL CPU i5 4. Generation 1,70 GHz * 4 RAM 4 GB GPU RAM 2 GB
Geschwindigkeitsvergleich von RDBMS mit NoSQL für INSERT, SELECT, UPDATE, DELETE, wobei eine unterschiedliche Anzahl von Zeilen ausgeführt wird 10.100.1000.10000.100000.1000000
Die zur Ausführung verwendete Sprache ist: PHP5 & Google schnellste Sprache GO 1.6
quelle
Hier ist eine kleine Untersuchung , die RDBMS vs NoSQL mit MySQL vs Mongo untersuchte. Die Schlussfolgerungen stimmten mit der Antwort von @Sean Reilly überein. Kurz gesagt, der Vorteil liegt im Design, nicht in einem Geschwindigkeitsunterschied. Schlussfolgerung auf Seite 35-36:
RDBMS vs NoSQL: Leistungs- und Skalierungsvergleich
quelle
Auf einem einzelnen Server wäre MongoDb sowohl beim Lesen als auch beim Schreiben nicht schneller als MySQL MyISAM, da die Tabellen- / Dokumentgrößen zwischen 1 GB und 20 GB liegen.
MonoDB ist bei paralleler Reduzierung auf Multi-Node-Clustern schneller, bei denen MySQL NICHT horizontal skalieren kann.
quelle