Byłem bardzo podekscytowany MongoDb i testowałem go ostatnio. Miałem tabelę o nazwie posty w MySQL z około 20 milionami rekordów indeksowanych tylko w polu o nazwie „id”.
Chciałem porównać prędkość z MongoDB i przeprowadziłem test, który losowo pobrałby i wydrukował 15 rekordów z naszych ogromnych baz danych. Uruchomiłem zapytanie około 1000 razy dla mysql i MongoDB i jestem zaskoczony, że nie zauważam dużej różnicy prędkości. Może MongoDB jest 1,1 razy szybszy. To bardzo rozczarowujące. Czy coś robię źle? Wiem, że moje testy nie są idealne, ale MySQL jest na równi z MongoDb, jeśli chodzi o czytanie intensywnych obowiązków.
Uwaga:
- Mam podwójny rdzeń + (2 wątki) i7 procesor i 4 GB RAM
- Mam 20 partycji na MySQL, każdy z 1 milionem rekordów
Przykładowy kod używany do testowania 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;
}
?>
Przykładowy kod do testowania 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;
}
?>