Tags:
create new tag
, view all tags

Tests faits sur MongoDB et MySQL

MySQL

Après avoir installé le serveur LAMP sur mon ordinateur, j'ai commencé par faire de simples tests pour me mettre à l'aise dans le nouvel environement (Je suis habitué à WAMP sous Windows avec une interface graphique). J'ai vite appris les commandes de base et j'ai créé une base de donnée nommée "LogsPivot". La prochaine étape était d'être capable d'importer les fichiers que j'ai généré avec mon programme Java vers la base de données.

J'ai trouvé la commande suivante :

LOAD DATA LOCAL INFILE '/home/cotes/workspace/LogsSimbadsNoMemorySpaceUsed/renduSimbadAuFormatPivot.log' INTO TABLE logs FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

Cette commande me permet d'importer un fichier CSV vers ma table (logs ici). Ne pas oublier qu'au moment de la connexion à MySQL, on doit préciser qu'on utilisera des fichiers locaux lors de la session d'utilisation :

mysql -u root -p --local-infile

Au niveau performance, l'importation des logs d'Aladin de l'année 2012 au complet a prit 5 minutes au total. Faire de grosses requêtes peut ensuite s'avéré difficile car plus il y a de résultats pour la requête, plus le temps d'affichage sera long.

Avantages
  • Il ne semble pas y avoir de limite pour la taille d'un fichier à importer dans la base de données (La taille du fichier d'Aladin 2012 est de 1,1 Go)
  • La documentation sur le web est excellente
  • Relationnel : Il serais possible de créer une autre table contenant par exemple les query-strings et la lier sur la table principale)
Désavantages
  • Le fait que ce soit relationnel est aussi un désavantage en soi : MySQL ne nous permet pas d'accepter une entrée qui aurait un champ propre à elle; tous les entrées doivent avoir les champs spécifiques de la table.
  • Quand on fait de grosses requêtes qui donnent des miliers de résultats, ça devient très lent.

MongoDB

La première étape avec MongoDB fut en faite de m'informer sur le principe des bases de données à documents (c'est une chose que nous n'avons jamais touché dans ma formation). J'ai donc lu et regarder quelques videos sur le principe même de la chose et je fut très heureux d'apprendre que mon problème majeur avec MySQL pourrait être reglé avec MongoDB; les documents peuvent contenir des "champs" bien à eux.

Par exemple, si on compare 2 logs Simbads sous forme de documents :

{
"ip_address" : "131.142.24.30",
"query_strings" : {
"idnt" : "1",
"submit" : "submit+id",
"id" : "UZ+Boo",
"protocol" : "html",
"Radius.unit" : "arcmin",
"Radius" : "10"
},
"user_agent" : "Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.0.1) Gecko/20020719 Netscape/7.0",
"method" : "sim-id",
"date" : "2006-11-01 20:28:03"
}

et

{
"ip_address" : "200.131.64.73",
"query_strings" : {
"id" : "%403064080",
"Name" : "TYC%208577-1672-1"
},
"user_agent" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510",
"method" : "sim-id",
"date" : "2006-11-01 19:51:15"
}

peuvent très bien être dans la même collection, même si ils ne contiennent pas les mêmes champs (Radius, Radius.unit, submit, etc. ne sont pas présents dans le deuxième document).

J'ai du chercher un peu plus pour trouver la commande d'importation mais j'ai fini par la trouver :

mongoimport -d logspivots -c logs --type json --file renduSimbadAuFormatPivot1.json --jsonArray // Cette commande s'éxécute dans le dossier ou se situe notre fichier (ici renduSimbadAuFormatPivot1.json)

Je l'ai testée avec plusieurs petits fichiers et tout allait bien jusqu'à ce que j'essaie d'importer un fichier de 250 Mo. J'ai appris par la suite que la limite pour MongoDB est un fichier de 16 Mo, mais, d'après ce qu'André m'a dit, il serait possible de pouvoir importer de plus gros avec l'aide d'un module externe.

J'ai passé une certaine partie de mon temps à faire des requêtes simple sur MongoDB pour interroger la base de donnée. Je suis habitué par exemple de faire un SELECT ip_address, date, method FROM logs WHERE method="sim-nameresolver". J'ai donc appris le "language" Mongo. La derniere requête par exemple, se traduirait par :

db.logs.find(
{
method: "sim-nameresolver"
},{_id:0, query_strings:0, user_agent:0})

J'ai aussi testé d'autres commandes très utiles telles : $exists, $gte (greater or equals), $lte (lower or equals, 2 dernieres très utile pour les dates) etc.

Avantages
  • Gros avantage : Sous forme de document, très pratique et mieux adapté que MySQL (surtout au niveau des query-strings).
  • Les requêtes sont rapides et quand les résultats de requêtes sont trop gros, MongoDB les charge partie par partie (beaucoup plus pratique que MySQL).
  • Quand les fichiers sont importables (> que 16 Mo), l'importation est quasi-instantanée.
Désavantages
  • La limite d'importation d'un fichier de taille de 16 Mo à été le plus gros désavantage que j'ai connu pour MongoDB jusqu'à présent. Celà ne m'a pas permis de vérifier quelles seraient les performances de MongoDB avec de plus gros fichiers.
  • La communautée web est considérablement moins grosse que MySQL mais la documentation du site officiel est très claire.
Topic revision: r2 - 2014-03-12 - CharlesCote
 
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback