Page 1 sur 1

champ index et load data infile

Posté : 15 déc. 2008, 13:28
par pierreC
Hello,

Je charge une grande table avec 64 indexes (sur 150 colonnes) et 7 millions de ligne depuis un csv avec un load data infile

Mieux vaut t'il que les indexes soit déjà présent avant le chargement ou bien est ce plus rapide de les rajouter après le chargement

a votre avis ?

Posté : 18 déc. 2008, 11:18
par caroube
Normalement, il semblerait que le loas data infile ne crée pas les index en cours d'import, mais uniquement à la fin :
If you use LOAD DATA INFILE on an empty MyISAM table, all non-unique indexes are created in a separate batch (as for REPAIR TABLE). Normally, this makes LOAD DATA INFILE much faster when you have many indexes. In some extreme cases, you can create the indexes even faster by turning them off with ALTER TABLE ... DISABLE KEYS before loading the file into the table and using ALTER TABLE ... ENABLE KEYS to re-create the indexes after loading the file. See Section 7.2.19, “Speed of INSERT Statements”.
http://dev.mysql.com/doc/refman/5.1/en/load-data.html
De plus, un index n'est pas un simple fichier texte avec une correspondance (valeur, n° de ligne). C'est un fichier avec une organisation de type arbre (généralement) qui permet d'améliorer l'accès aux données. Si ton index est construit au fur et à mesure, il est recalculé à chaque donnée importée, des branches sont créées, d'autres sont déplacées, en tenant compte de la structure précédente et de la valeur importée. Beaucoup de travail inutile et un arbre pas forcément bien structuré.

Et enfin, il vaut mieux une seule opération d'indexation que 7 millions : cela évite quelques millions d'écriture sur le disque.
Re-create the indexes with myisamchk -rq /path/to/db/tbl_name. This creates the index tree in memory before writing it to disk, which is much faster that updating the index during LOAD DATA INFILE because it avoids lots of disk seeks. The resulting index tree is also perfectly balanced.
http://dev.mysql.com/doc/refman/5.1/en/ ... speed.html
Je te conseillerais de créer tes index uniquement à la fin. Mais là comme pour le reste, je pense qu'un test avec un chrono dans la main sera le meilleur juge.

Posté : 18 déc. 2008, 11:59
par zeus
Comme le dit caroube, il vaut mieux construire tes indexs à la fin.

Si tu décides de faire autrement, MySQL va reconstruire tes indexs à chaque insertion, ce qui est inutile sachant que tu sais qu'il y aura d'autres indexs après.

Par contre, je ne te cache pas que, pour tes volumétries, la reconstruction des indexs va prendre beaucoup de temps.