Si vous avez principalement des tables MyISAM, vous devez augmenter le tampon d'insertion en bloc . Voici ce que dit la documentation MySQL sur la définition de bulk_insert_buffer_size :
MyISAM utilise un cache en forme d'arbre spécial pour accélérer les insertions en bloc pour INSERT ... SELECT, INSERT ... VALUES (...), (...), ... et LOAD DATA INFILE lors de l'ajout de données à non vide les tables. Cette variable limite la taille de l'arborescence du cache en octets par thread. Le mettre à 0 désactive cette optimisation. La valeur par défaut est 8 Mo.
Il y a deux choses que vous devez faire
1) Ajoutez-le à /etc/my.cnf
[mysqld]
bulk_insert_buffer_size=512M
2) Définissez sa valeur globale
SET GLOBAL bulk_insert_buffer_size = 1024 * 1024 * 512;
Si vous n'avez pas le privilège de définir globalement bulk_insert_buffer_size, procédez comme suit
service mysql restart
Bien sûr, ce n'est pas pour InnoDB.
Sous un autre angle, que les tables soient InnoDB ou MyISAM, si les index sont plus grands que la table, vous pouvez avoir trop d'index. Je pense généralement qu'un rechargement d'un MyISAM mysqldump devrait prendre 3 fois plus de temps que le mysqldump a pris. Je pense également qu'un rechargement d'un mysqldump InnoDB devrait prendre 4 fois plus de temps que le mysqldump a pris.
Si vous dépassez le ratio 4: 1 pour recharger un mysqldump, vous avez certainement l'un des deux problèmes suivants:
- trop d'index
- index juste trop grands en raison de grandes colonnes
Vous pouvez mesurer la taille de vos données par moteur de stockage avec ceci:
SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size" FROM
(SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM
information_schema.tables WHERE table_schema NOT IN
('mysql','information_schema','performance_schema') AND
engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,
(SELECT 3 pw) A ORDER BY TSize;
Voyez si les index sont presque aussi gros que les données ou même plus gros
Vous pouvez également envisager de désactiver la journalisation binaire comme ceci:
echo "SET SQL_LOG_BIN=0;" > footable.sql
mysqldump --databases foo >> footable.sql
avant de recharger le script