Vous devez absolument choisir votre approche en fonction du type de moteur... optimisation pour MyISAM ou pour InnoDB .
Nous avons récemment exécuté un benchmark comparant différentes façons d'insérer des données et mesuré le temps entre avant l'insertion et jusqu'à ce que tous les index soient entièrement restaurés. C'était sur une table vide, mais nous avons utilisé jusqu'à 10 millions de lignes.
MyISAM avec LOAD DATA INFILE
et ALTER TABLE ... ENABLE/DISABLE KEYS
a gagné haut la main dans notre test (sur un système Windows 7, MySQL 5.5.27 - maintenant nous l'essayons sur un système Linux).
ENABLE et DISABLE KEYS ne fonctionnent pas pour InnoDB, c'est uniquement MyISAM. Pour InnoDB, utilisez SET AUTOCOMMIT = 0; SET FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;
si vous êtes sûr que vos données ne contiennent pas de doublons (n'oubliez pas de les mettre à 1
une fois le téléchargement terminé).
Je ne pense pas que vous ayez besoin de OPTIMIZE TABLE
après une insertion en masse - les lignes MySQL sont triées par insertion et l'index est quand même reconstruit. Il n'y a pas de "fragmentation supplémentaire" en faisant une insertion en masse.
N'hésitez pas à commenter si j'ai fait des erreurs factuelles.
MISE À JOUR : Selon nos résultats de test les plus récents et les plus complets, le conseil de DÉSACTIVER / ACTIVER les touches est erroné.
Un collègue a fait exécuter plusieurs tests différents à un programme - une table avec InnoDB / MyISAM préremplie et vide, des vitesses de sélection et d'insertion avec LOAD DATA LOCAL
, INSERT INTO
, REPLACE INTO
et UPDATE
, sur des tables "dense" et "fragmentées" (je ne sais pas trop comment, je pense que c'était dans le sens de DELETE FROM ... ORDER BY RAND() LIMIT ...
avec une graine fixe donc c'est toujours comparable) et des index activés et désactivés.
Nous l'avons testé avec de nombreuses versions différentes de MySQL (5.0.27, 5.0.96, 5.1.something, 5.5.27, 5.6.2) sur Windows et Linux (pas les mêmes versions sur les deux OS, cependant). MyISAM ne gagnait que lorsque la table était vide. InnoDB était plus rapide lorsque les données étaient déjà présentes et fonctionnait généralement mieux (sauf pour l'espace disque dur - MyISAM est plus petit sur le disque).
Pourtant, pour vraiment en profiter, il faut le tester soi-même - avec différentes versions, différents paramètres de configuration et beaucoup de patience - notamment en ce qui concerne les incohérences bizarres (le 5.0.97 était beaucoup plus rapide que le 5.5.27 avec la même config - nous cherchons toujours la cause). Ce que nous avons trouvé était que DISABLE KEYS
et ENABLE KEYS
sont presque sans valeur et parfois nuisibles si vous ne commencez pas avec une table vide.