He estado muy entusiasmado con MongoDb y lo he estado probando últimamente. Tenía una tabla llamada posts en MySQL con aproximadamente 20 millones de registros indexados solo en un campo llamado 'id'.
Quería comparar la velocidad con MongoDB y ejecuté una prueba que obtendría e imprimiría 15 registros al azar de nuestras enormes bases de datos. Ejecuté la consulta unas 1,000 veces cada una para mysql y MongoDB y me sorprende que no note mucha diferencia en la velocidad. Quizás MongoDB es 1.1 veces más rápido. Eso es muy decepcionante. ¿Hay algo que estoy haciendo mal? Sé que mis pruebas no son perfectas, pero MySQL está a la par con MongoDb cuando se trata de leer tareas intensivas.
Nota:
- Tengo dual core + (2 hilos) i7 cpu y 4GB ram
- Tengo 20 particiones en MySQL, cada una de 1 millón de registros
Código de muestra utilizado para probar 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;
}
?>
Código de muestra para probar 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;
}
?>