Ich war sehr begeistert von MongoDb und habe es in letzter Zeit getestet. Ich hatte eine Tabelle namens posts in MySQL mit etwa 20 Millionen Datensätzen, die nur auf einem Feld namens "id" indiziert waren.
Ich wollte die Geschwindigkeit mit MongoDB vergleichen und habe einen Test durchgeführt, bei dem 15 Datensätze zufällig aus unseren riesigen Datenbanken abgerufen und gedruckt wurden. Ich habe die Abfrage jeweils etwa 1.000 Mal für mysql und MongoDB ausgeführt und bin überrascht, dass ich keinen großen Geschwindigkeitsunterschied feststellen konnte. Vielleicht ist MongoDB 1,1 Mal schneller. Das ist sehr enttäuschend. Mache ich etwas falsch? Ich weiß, dass meine Tests nicht perfekt sind, aber ist MySQL mit MongoDb gleichauf, wenn es um leseintensive Aufgaben geht?
Anmerkung:
- Ich habe Dual Core + ( 2 Threads ) i7 cpu und 4GB ram
- Ich habe 20 Partitionen in MySQL mit jeweils 1 Million Datensätzen
Beispielcode für das 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;
}
?>