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. ;)















2008-08-26 à 9.01 pm
InnoDB stock les données en les insérant selont l’ordre de la clé primaire (la cause ?)
Ex :
Données ‘D’, ‘B’, ‘C’, ‘A’ seront dans une tables myisam :
D
B
C
A
(ordre de création)
et
A
B
C
D
dans une table innodb.
Si tu as mis une clé primaire sur le champs email, il serait interessant de la supprimer et de retester l’import pour voir quelles différences persistent.
2008-08-26 à 9.12 pm
Non, la clef primaire est sur un ID numérique auto-incrémenté. Cela ne peux donc pas venir de là. Je ne mets jamais de clef étrangère sur des chaînes de caractères. Simple intuition qui se révèle apparemment justifiée d’après tes propos. ;)