371 votes

MySQL vs Mongodb 1000 lectures

J'ai été très excité à propos de MongoDb et ont pu tester ces derniers temps. J'ai eu une table posts dans MySql avec environ s'élevant à 20 millions d'enregistrements indexés uniquement sur un champ 'id'.

J'ai voulu comparer la vitesse avec MongoDb et j'ai couru un test qui permettrait d'obtenir et d'imprimer des 15 dossiers au hasard à partir de nos bases de données énormes. J'ai couru à la requête d'environ 1 000 fois chacun pour mysql et mongodb et je suis surpised que je ne remarque pas beaucoup de différence dans la vitesse. Peut-être Monogodb est de 1,1 fois plus rapide. C'est très décevant. Est-il quelque chose que je fais mal? Je sais que mes tests ne sont pas parfaites mais MySQL est sur le pair avec MongoDb quand il s'agit de lecture intensive des tâches ménagères.

Note:

  • J'ai dual core + ( 2 threads ) i7 et 4 go de ram
  • J'ai 20 partitions sur mysql chacune de 1 million d'enregistrements

Exemple De Code Utilisé Pour Les Tests De 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;
}

?>

Exemple de Code Pour le Test 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;
}
?>

731voto

Sean Reilly Points 9869

MongoDB est pas par magie plus rapide. Si vous stockez les mêmes données, organisées en gros de la même manière, et l'accès c'est exactement de la même manière, alors il est fou de s'attendre à des résultats extrêmement différents. Après tout, MySQL et MongoDB sont à la fois GPL, donc si Mongo eu quelques magiquement mieux IO du code, puis le MySQL gars pourrait tout à l'intégrer dans leur code.

Les gens voient du monde réel MongoDB performance en grande partie parce que MongoDB permet d'interroger de manière différente, qui est plus sensible à votre charge de travail.

Considérons, par exemple, une conception qui a persisté beaucoup d'informations à propos d'un compliqué entité dans un normalisée de la mode. Cela pourrait facilement utiliser des dizaines de tables dans MySQL (ou tout relationnel) pour stocker les données en forme normale, avec de nombreux indices nécessaires pour garantir l'intégrité relationnelle entre les tables.

Considérons maintenant le même design avec une banque de document. Si toutes ces tables liées sont subordonnées à la table principale (et ils le sont souvent), alors vous pourriez être en mesure de modéliser les données, telles que l'ensemble de l'entité est stocké dans un seul document. Dans MongoDB, vous pouvez stocker la présente comme un document unique, dans une seule collection. C'est là que MongoDB commence en permettant des performances supérieures.

Dans MongoDB, pour récupérer l'ensemble de l'entité, vous devez procéder à:

  • Un index de recherche sur la collection (en supposant que l'entité est récupérée par id)
  • Récupérer le contenu d'une page de base de données (le binaire document json)

Ainsi, un b-arbre de recherche, et un binaire de lecture de page. Log(n) + 1 IOs. Si les index peuvent se trouver entièrement dans la mémoire, puis 1 IO.

Dans MySQL avec 20 tables, vous devez procéder à:

  • Une recherche d'index à la racine de la table (encore une fois, en supposant que l'entité est récupérée par id)
  • Avec un index cluster, on peut supposer que les valeurs de la racine de la ligne dans l'index
  • 20+ plage de recherches (espérons-le sur un index) pour la valeur de clé primaire de l'entité
  • Ces ne sont probablement pas d'index en cluster, de sorte que les mêmes 20+ données des recherches une fois que l'on à comprendre ce que l'enfant approprié de lignes.

De sorte que le total pour mysql, même en supposant que tous les indices sont dans la mémoire (ce qui est plus difficile car il y a 20 fois plus) est d'environ 20 plage de recherches.

Celles-ci vont des recherches sont susceptibles composé de hasard IO - différentes tables sera certainement résider dans des endroits différents sur le disque, et il est possible que des lignes différentes dans la même gamme dans le même tableau pour une entité peut ne pas être contigus (en fonction de la façon dont l'entité a été mis à jour, etc).

Ainsi, pour cet exemple, le score final est d'environ 20 fois plus de IO avec MySQL par l'accès logique, par rapport à MongoDB.

C'est de cette façon MongoDB d'améliorer les performances dans certains cas d'utilisation.

64voto

theAndroid Points 293

Avez-vous de la concurrence, je.e utilisateurs simultanés ? Si vous venez d'exécuter à 1000 fois la requête de la droite, avec juste un fil, il n'y aura presque pas de différence. Trop facile pour ces moteurs :)

MAIS je vous suggère fortement de construire un vrai test de charge de session, ce qui signifie que l'aide d'un injecteur comme JMeter avec 10, 20 ou 50 utilisateurs EN MÊME TEMPS de sorte que vous pouvez vraiment voir une différence (essayez d'intégrer ce code à l'intérieur d'une page web JMeter pourrait requête).

Je l'ai fait aujourd'hui sur un seul serveur (et une simple collection / table) et les résultats sont assez intéressants et surprenants (MongoDb a été beaucoup plus rapide sur les écritures et les lectures, comparativement à moteur MyISAM et InnoDb moteur).

Cela devrait vraiment être une partie de votre test : la simultanéité & MySQL moteur. Ensuite, les données et le schéma de conception, l'application et les besoins sont bien sur d'énormes besoins, au-delà des temps de réponse. Laissez-moi savoir quand vous obtenez des résultats, je suis aussi dans le besoin d'entrées sur ce sujet!

23voto

Gabe Rainbow Points 751

l'homme,,, la réponse est que vous êtes fondamentalement tester PHP et non pas une base de données.

ne vous embêtez pas à réitérer les résultats, que ce soit en commentant l'impression ou non. il y a un morceau de temps.

   foreach ($cursor as $obj)
    {
        //echo $obj["thread_title"] . "<br><Br>";
    }

tandis que l'autre partie est passer yacking un tas de rand nombre.

function get_15_random_numbers()
{
    $numbers = array();
    for($i=1;$i<=15;$i++)
    {
        $numbers[] = mt_rand(1, 20000000) ;

    }
    return $numbers;
}

puis theres une différence majeure b/w imploser et dans.

et enfin ce qui se passe ici. ressemble à la création d'une connexion à chaque fois, donc son essai sur le temps de connexion plus le moment de la requête.

$m = new Mongo();

vs

$db = new AQLDatabase();

si votre 101% plus rapide peut-être 1000% plus rapide pour la requête sous-jacente dépouillé de jazz.

urghhh.

-6voto

zhuomin chen Points 1

Sur un serveur unique, MongoDb ne serait pas un plus rapide que mysql MyISAM sur les deux lire et écrire, compte tenu de la taille de la table/doc sont petit 1 Go à 20 Go.
MonoDB sera plus rapide sur réduire parallèlement sur les clusters à plusieurs nœuds, où Mysql ne peut pas évoluer horizontalement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X