SORU
14 Mart 2012, ÇARŞAMBA


Vs MongoDB 1000 okur MySQL

MongoDb hakkında çok heyecanlı olmuştur ve son zamanlarda test edilmiştir. Tablo 20 milyon albüm ile MySQL mesajlar alan adı Sadece endeksli adı vardı. kimliği

Ve bir test yaptım MongoDB ile hız karşılaştırmak istedim ve bizim büyük veritabanlarından rastgele 15 kayıtları yazdırın. Sorgu mysql ve MongoDB için yaklaşık 1000 kez her koştum ve hız farkı çok fark yok şaşırıyorum. Belki MongoDB 1.1 kat daha hızlı. Bu gerçekten üzücü. Ben yanlış yapıyorum bir şey var mı? Benim testler mükemmel değildir ama yoğun işleri okumaya gelince MongoDb ile eşit MySQL olduğunu biliyorum.


Not:

  • Çekirdek ( 2 konuları ) i7 işlemci ve 4 GB ram çift var
  • 1 milyon kayıtları MySQL her 20 bölüm var

Örnek Kodu Test MongoDB İçin Kullanılır

<?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;
}

?>


Test MySQL İç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;
}
?>

CEVAP
14 Mart 2012, ÇARŞAMBA


MongoDB sihirli bir şekilde daha hızlı değildir. Aynı veri deposu, temelde aynı şekilde organize ve tam olarak aynı şekilde erişimi varsa, o zaman gerçekten sonuçlar oldukça farklı olmasını beklememeli. Sonuçta, MySQL ve MongoDB eğer Mongo mucizevi bir şekilde daha iyi IO kodu olsaydı, o zaman MySQL adamlar kod temeli içine dahil böylece hem GPL.

İnsanlar büyük ölçüde MongoDB iş yükünüz için daha mantıklı olduğunu farklı bir şekilde sorgulamak için izin verir, çünkü gerçek dünyada MongoDB performans görüyoruz.

Örneğin, değiştirilmiş bir biçimde karmaşık bir varlık hakkındaki bilgiler çok kalıcı bir tasarım düşünün. Bu kolayca MySQL (veya herhangi bir ilişkisel db) fazla dizin tablolar arasında ilişkisel bütünlüğünü sağlamak için gerekli olan normal form verileri saklamak için tablolar onlarca kullanabilirsiniz.

Şimdi bir belge deposu ile aynı tasarım düşünün. Eğer bu tablo ilgili tüm ana tabloya bağımlı (ve genellikle), bu veri tüm varlık tek bir belge içinde depolanan bu model için mümkün olabilir. MongoDB tek bir koleksiyon tek bir belge olarak saklayabilirsiniz. Bu MongoDB üstün performans sağlayan başlıyor.

MongoDB, bütün varlık almak için, gerçekleştirmek zorunda:

  • Bir dizin koleksiyonu (varlık kimliği tarafından getirilen varsayarak) arama
  • Bir veritabanı sayfanın içeriğini (asıl ikili json belge) almak

B-bir arama ağacı ve ikili bir sayfa okuyun. Günlük(n) 1 İOs. Dizinler tamamen bellekte, sonra 1 IO bulunabilir.

20 tablo ile MySQL, gerçekleştirmek zorunda:

  • Bir dizini tablo (yine varlık olduğunu varsayarak kimliği tarafından getirilen) üzerinde arama
  • Kümelenmiş bir dizin, kök hücre değerleri endeks içinde olduğunu varsayabiliriz
  • İşletmenin pk değeri 20 Aralık aramaları (umarım bir dizin)
  • Bunlar muhtemelen aynı 20 verileri uygun alt satırları ne yapacağımızı bir kez aramaları çok kümelenmiş dizinler değil.

Mysql, hatta tüm dizinleri bellek onlardan 20 kat daha fazla olduğundan daha zor olan) olduğunu varsayarak için toplam 20 Aralık aramaları.

Bu dizi arama ihtimalinin oluşan rasgele IO — farklı tablolar kesinlikle bulunan farklı noktalar üzerinde disk ve mümkün olan farklı satırları aynı aralıkta aynı tablo için bir varlık olmayabilir bitişik (nasıl bağlı varlık güncellendi, vb).

Yani bu örnek için, kesin sonuçları hakkında20 keredaha mantıksal erişim başına MySQL ile IO, MongoDB göre.

Bu MongoDB performansı artırabilirbazı durumlarda kullanın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Amir Parmar

    Amir Parmar

    25 Kasım 2010
  • iMasterful

    iMasterful

    11 EYLÜL 2009
  • ODN

    ODN

    26 Kasım 2006

İLGİLİ SORU / CEVAPLAR