MongoDb hakkında çok heyecanlandım ve son zamanlarda test ediyorum. MySQL'de mesajlar olarak adlandırılan bir tablo vardı ve yaklaşık 20 milyon kayıt sadece 'id' adı verilen bir alanda indekslendi.
Hızı MongoDB ile karşılaştırmak istedim ve devasa veritabanlarımızdan rasgele 15 kayıt alıp yazdıracağım bir test yaptım. Sorguyu mysql ve MongoDB için yaklaşık 1.000 kez çalıştırdım ve hızda çok fazla fark görmediğime şaşırdım. Belki MongoDB 1.1 kat daha hızlıdır. Bu çok hayal kırıklığı yaratıyor. Yanlış yaptığım bir şey var mı? Testlerimin mükemmel olmadığını biliyorum ama yoğun işleri okumak söz konusu olduğunda MongoDb ile eşit MySQL.
Not:
- Çift çekirdekli + (2 iş parçacığı) i7 cpu ve 4GB ram var
- MySQL'de her biri 1 milyon kayıttan 20 bölüm var
MongoDB Testinde Kullanılan Örnek Kod
<?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;
}
?>
MySQL Testi için Örnek Kod
<?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;
}
?>