IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

ENGINE = MEMORY => faible performance [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de myz-rix
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 143
    Par défaut ENGINE = MEMORY => faible performance
    Bonjour, afin d'optimiser un serveur j'ai voulu tester l'efficacité du moteur MEMORY de mysql et je suis assez déçu.

    La mémoire va tout de même beaucoup beaucoup plus vite qu'un disque dur, je ne comprend pas qu'on ne retrouve pas cette différence avec le moteur MEMORY.

    Je gagne que 10% de temps, voir au mieux 20%, cela vous parait il normal ?

    voici le test que j'ai fait qui permet d'ecrire et lire une table de test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    //**************************
    //**************************
    // *** PARAMETRAGES
    $enregistrement_max = 10000;
    $requete_max = 10;
    $base = "engine_test";
    $table_temp = "table_test";
    $engine_array = array("ENGINE = MYISAM","ENGINE = MEMORY");
    //$engine = "ENGINE = MYISAM";
    //**************************
    //**************************
    foreach($engine_array as $engine)
    {
    print "<br>ENGINE => ".$engine;
    $t1 = mktime();
     
    //*******************
    mysql_query("DROP DATABASE $base");
    mysql_query("CREATE DATABASE $base") or die(mysql_error());
    //*******************
     
    //$table_source = "20090130_produit_pamimu";
     
     
    mysql_db_query($base,"DROP TABLE `$table_temp`"); 
     
     
     mysql_db_query($base,"CREATE TABLE `$table_temp` (
    `id` INT( 7 ) NOT NULL ,
    `x` INT( 15 ) NULL ,
    `y` INT( 15 ) NULL ,
    `z` INT( 15 ) NULL ,
    `o` INT( 15 ) NULL ,
    INDEX (
    `id`
    )
    ) $engine ") or die(mysql_error());
     
     
     
     
    // *** On rempli la base avec des valeurs quelconques
    $id = 0;
    $enregistrement_max_i = $enregistrement_max;
    while($enregistrement_max_i > 0)
     {
     $id++;
     $x = rand(1000000,9000000);
     $y = rand(1000000,9000000);
     $z = rand(1000000,9000000);
     $o = rand(1000000,9000000);  
     mysql_db_query($base,"INSERT INTO `$table_temp` (id,x,y,z,o) VALUES ('$id','$x','$y','$z','$o')") or die(mysql_error());
     $enregistrement_max_i--;
     }
     
     
     
     
    $t2=mktime();
    //print '<br>timestamp = '.$t2;
    print '<br>ecart='.($t2-$t1);
    $requete_max_i = $requete_max;
    while($requete_max_i > 0)
     {
     $update_req = mysql_db_query($base,"SELECT * FROM `$table_temp`") or die(mysql_error());
     while($update_data = mysql_fetch_array($update_req))
     {
     $u_x = rand(1000000,9000000);
     $u_y = rand(1000000,9000000);
     $u_z = rand(1000000,9000000);
     $u_o = rand(1000000,9000000);  
     mysql_db_query($base,"UPDATE `$table_temp` SET x = '$u_x', y = '$u_y', z= '$u_z', o = '$u_o' WHERE id ='$update_data[id]'") or die(mysql_error());
     $enregistrement_max_i--;
     }
     
     
     $requete_max_i--;
     }
    // TEST CONTROLE
    $test_req = mysql_db_query($base,"SELECT * FROM `$table_temp` WHERE id='".($enregistrement_max-10)."'") or die(mysql_error());
    $test_data = mysql_fetch_array($test_req);
    print '<br>TEST = '.$test_data[id].'-'.mysql_num_rows($test_req);
     
     
    //***********************
    $t3=mktime();
    //print '<br>timestamp = '.$t3;
    print '<br>ecart='.($t3-$t2);
     
    print '<br>ecart='.($t3-$t1);
     
    }

    j'obtiens ceci:


    ENGINE => ENGINE = MYISAM
    ecart=6
    TEST = 9990-1
    ecart=58
    ecart=64
    ENGINE => ENGINE = MEMORY
    ecart=5
    TEST = 9990-1
    ecart=53
    ecart=58

    je passe de 64s à 58s ... pas énorme, non ?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    oui pas énorme. Mais c'est peut être plutôt dû à la configuration du serveur ? Ou sa puissance.
    Car si tu créé un table de type memory, mais que derrière le système te swap, tu conviendras que c'est complètement inutile d'avoir choisit ce moteur.
    De la même manière si les index sont stockés sur le disque le gain sera, j'imagine, limité.

    Enfin, j'aurai vu ce thread dans le sous forum mysql de sgdb, car c'est plus relatif à l'administration qu'à l'interaction entre php et mysql.

    a plus

  3. #3
    Membre éclairé
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Par défaut
    Je confirme qu'il doit y avoir un souci dans tes tests. A titre d'informations, en passant certaines recherches de myisam a memory, on est apssé de requetes de 3-5s à quelques ms (dans le cadre d'une base en prod). Donc un gain pas loin de 1000.

    Quelle est la config du serveur? (RAM, notamment).

    D'autant qu'en regardant ton test, je me demande si ce n'est pas à cause de celui-ci justement. Etant donné que table est indexée sur un id, et que tu l'utilise, l'update est quasi instantanée, parce que justement tu es indexée dessus, donc la recherche est rapide. En plus, tu effectue 10'000 update, et c'est l'aller-retour mysql-php qui prendra le plus de temps dans ton test, a mon avis => peu de différence.

    Effectue exactement le meme test, mais génère 1'000'000 d'enregistrement, et effectu un search dans un champ non indéxé, ou des update sans utiliser ta clé. Ou meme un select avec plusieurs conditions dans ton where, qui ne sont pas sur ton champ d'index. Je pense que tu verra clairement la différence.

    A mon avis, ton test est trop "théorique" pour avoir une réelle signifiation.

    Onet

  4. #4
    Membre très actif Avatar de myz-rix
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 143
    Par défaut merci pour tout :)
    Merci les gars, je viens de faire des essais en enlevant l'index de la table et en supprimant la clause WHERE dans le update et l'écart ce creuse énormément j'ai un rapport de 1/5 maintenant.

    Avant d'orienter toute ma programmation vers le moteur MEMORY je voulais m'assurer que ça aller être utile .

    Hop timiser, Hop timiser, Hop timiser, Hop Hop

  5. #5
    Membre éclairé
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Par défaut
    Citation Envoyé par myz-rix Voir le message
    Merci les gars, je viens de faire des essais en enlevant l'index de la table et en supprimant la clause WHERE dans le update et l'écart ce creuse énormément j'ai un rapport de 1/5 maintenant.

    Avant d'orienter toute ma programmation vers le moteur MEMORY je voulais m'assurer que ça aller être utile .

    Hop timiser, Hop timiser, Hop timiser, Hop Hop
    Attention a cela, n'oublie pas que la table memory ne doit être utilisée qu'en table "temporaire", ou duplicata! Car les données sont en mémoire, ce qui signifie que si ton serveur reboot, pour X ou Y raison, tu perds toutes tes données!

    Et que si tu as une table trop importante, toutes les données ne pourront etre stockée en mémoire, et tu risque de te retrouver avec une table pleine.

    L'utilisation d'une table MEMORY est quelque chose qui se fait dans certains cas! Et je conseille très fortement de l'utiliser conjointement à l'utilisation de trigger mysql ou functions...

    Onet

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [9.2] Faibles performances d'une recherche dans un index avec GROUP BY
    Par Sebajuste dans le forum Requêtes
    Réponses: 6
    Dernier message: 12/03/2015, 18h50
  2. Faibles performances avec un espace de stockage "simple"
    Par Isaldas dans le forum Windows 8
    Réponses: 0
    Dernier message: 12/12/2014, 15h44
  3. Faible performance Tomcat "GC overhead limit exceeded"
    Par questionneuse dans le forum Tomcat et TomEE
    Réponses: 17
    Dernier message: 14/09/2011, 15h19
  4. Memory Leaks in MemoryManager Yes engine
    Par couet dans le forum C++
    Réponses: 6
    Dernier message: 16/02/2007, 14h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo