RSS
people

Optimisation MySQL - MyISAM ou InnoDB ?

Lors de l’implémentation d’un script d’import massif d’adresses emails (environ 120.000 adresses), je me suis buté à une lenteur non négligeable de mon script. Plus de deux heures pour effectuer l’import. Je ne pouvais pas me permettre de laisser une telle longueur d’exécution pour mon ego personnel mes clients. :p

Après avoir essayé d’optimiser un maximum le code, je n’ai pas réussi à optimiser énormément le script. Je me suis donc penché du côté de la base de données. Je me suis donc amusé à modifier le moteur de ma table. Plusieurs choix m’étaient possibles, mais seuls deux me parlaient réellement, suite à la lecture de différents articles et à mon expérience personnelle : InnoDB et MyISAM.

InnoDB est un moteur de recherche prenant en charge les contraintes de clefs étrangères (ce qui me fait l’utilier le plus souvent), les transactions avec commit et rollback. MyISAM lui n’intègre pas toutes ses vérifications. Il est donc, en théorie, plus rapide. Il est d’ailleurs plebiscité pour les grosses requêtes de type SELECT. Cela ne nous intéresse pas dans notre cas (uniquement des INSERT). Qu’en est-il donc de ce changement de moteur ?

Pour faire mes tests, je me suis basé sur l’insertion de 500 enregistrements. Voici les temps moyens d’exécutions :

InnoDB : 41.4224 s
MyISAM : 0.1716 s

On constate donc que MyISAM est bien plus rapide qu’InnoDB. Moralité : employer MyISAM si aucune fonctionnalité avancée de MySQL ne doit être utilisée. Dans mon cas, cela a allégé la durée d’exécution de script : de deux heures, je suis passé à une minute. D’où un gain merveilleux. Et des clients satisfaits. ;)

2 réactions | Tags : , ,

Optimisation PHP - Casting de variables (floatvar, (float) et settype)

En PHP, il existe de nombreuses fonctions. Tellement nombreuses que certaines se révèlent redondantes. Parfois avec des performances différentes. Nous allons étudier aujourd’hui les différentes méthodes nous permettant de caster (changer le type) de nos variables.

Pour ce faire, nous nous baserons sur la conversion d’un nombre réel (float) grâce à l’utilisation de trois méthodes :

  1. floatvar
  2. Simple casting : (float)
  3. settype

Pour faire ces tests, je me suis basé sur le code suivant :

    $i = "3.4";
   
    $maxLoop = 10000000;
   
    for( $c = 0 ; $c < = $maxLoop ; $c++ )
    {
        $timer1 = microtime(true);
        floatval($i);
        $timer2 = microtime(true);

        $average_floatval += ($timer2 - $timer1);
       
        $timer1 = microtime(true);
        (float)$i;
        $timer2 = microtime(true);
       
        $average_float += ($timer2 - $timer1);
       
        $timer1 = microtime(true);
        settype($i, ‘float’);
        $timer2 = microtime(true);
       
        $average_settype += ($timer2 - $timer1);
    }

Il suffit ensuite de diviser les différentes moyennes par le nombre d’occurences, et on tombe sur la durée moyenne d’exécution du cast.

Afin d’obtenir des tests significatifs en statistiques, il est important de se baser sur une population la plus vaste possible. C’est pourquoi nous effectuons 10.000.000 (oui, dix millions !) de tests. Nous pourrions aller plus loin, mais il a déjà fallu mettre en place une directive set_time_limit pour achever tout cela. ;)

Les résultats, sans plus attendre…

floatval 2.141 µs
(float) 1.87 µs
settype 2.387 µs

Ainsi, nous voyons que le casting direct est 14 % plus rapide par rapport à floatval. Comme quoi il serait grand temps de faire un peu de ménage dans les fonctions PHP : fonctions redondantes, pas optimisées, etc… ;)

2 réactions | Tags : ,

PHP : Appeller une méthode d’une classe avec array_walk

Le PHP dispose de tant de fonctions que certaines sont méconnues du grand public - grand public a vocation très geek, je vous l’accorde. ;) La fonction array_walk en fait partie. Elle permet d’appliquer une fonction à tous les éléments d’un tableau très facilement. Par exemple :

$foo = array( 1, 2, 3, 4 );

function Square(&$i)
{
    return $i * $i;
}

array_walk($foo, Square);

echo ‘<pre>’;
print_r($foo);
echo ‘</pre>’;

On remarquera le passage par référence, obligatoire pour retrouver une trace de notre fonction en dehors de celle-ci.

Ce code affichera :

Array
(
    [0] => 1
    [1] => 4
    [2] => 9
    [3] => 16
)

Cependant, comment appeller une méthode d’une classe avec cette fonction ? Il suffit tout simplement de lui passer un tableau en second paramètre, contenant le nom de la classe et le nom de la méthode. Démonstration.

array_walk($foo, array( ‘MyClass’, ‘MyMethod’ ));

Et c’est tout. Petite astuce toute simple qu’il faut cependant savoir. :)

Aucune réaction |

Table de pays MySQL

Voici un script SQL fort utile permettant la création d’une table countries regroupant tous les pays existant dans le monde. Elle en recense 246, conformément à la norme ISO 3166-1.Cette table contient trois champs.

  1. id : Clef primaire de la table
  2. name : Nom français du pays
  3. code : Code Alpha-2 du pays

A noter que la table est encodée en UTF-8, en utilisant le moteur de stockage InnoDB, très utile pour toute la gestion des clefs étrangères que vous ne manquerez pas de faire. ;)

Télécharger la table SQL des pays du monde

[EDIT : Correction de "\n" en trop dans les codes Alpha-2.]

Aucune réaction | Tags :

Rediriger son nom de domaine sans www vers le domaine avec www

Sur certaines configurations DNS, le nom de domaine sans www ne redirige pas forcément vers le nom de domaine avec www. Cela peut poser trois problèmes majeurs. Le premier, au niveau des statistiques. En effet, les deux sites seront considérés comme deux sites différents. Les stats seront donc dilués. De même, au niveau des pageranks des deux pages. Chaque site pourra en effet indiquer l’un ou l’autre, et cela divisera d’autant plus le nombre de backlinks vers votre site. Enfin, plus grave, le Duplicate Content. Pour les moteurs de recherche, vous avez en effet deux sites différents mais rigoureusement identiques. Ce qui va forcément vous pénaliser au niveau référencement.

Comment se sortir d’une telle situation ? En mettant en place une redirection 301 (ou redirection permanente). Pour ce faire, ce petit morceau de .htaccess vous aider.

RewriteCond %{HTTP_HOST} ^votresite.com$
RewriteRule ^(.*) http://www.votresite.com/$1 [QSA,L,R=301]

Rien de bien compliqué, à condition toutefois d’avoir quelques notions en .htaccess. ;)

3 réactions | Tags : ,