Se si dispone principalmente di tabelle MyISAM, è necessario aumentare il buffer di inserimento di massa . Ecco cosa dice la documentazione di MySQL sull'impostazione bulk_insert_buffer_size :
MyISAM utilizza una speciale cache ad albero per rendere più rapidi gli inserimenti di massa per INSERT ... SELECT, INSERT ... VALUES (...), (...), ... e LOAD DATA INFILE quando si aggiungono dati a non vuoto tabelle. Questa variabile limita la dimensione dell'albero della cache in byte per thread. Impostandolo su 0 disabilita questa ottimizzazione. Il valore predefinito è 8 MB.
Ci sono due cose che devi fare
1) Aggiungilo a /etc/my.cnf
[mysqld]
bulk_insert_buffer_size=512M
2) Impostare il valore globale per esso
SET GLOBAL bulk_insert_buffer_size = 1024 * 1024 * 512;
Se non si dispone del privilegio di impostare bulk_insert_buffer_size a livello globale, procedere come segue
service mysql restart
Naturalmente, questo non è per InnoDB.
Da un altro punto di vista, se le tabelle sono InnoDB o MyISAM, se gli indici sono più grandi di quelli della tabella, è possibile che vi siano troppi indici. Di solito mi rendo conto che un ricaricamento di un mysqldump MyISAM dovrebbe impiegare 3 volte il tempo necessario al mysqldump. Ho anche notato che un ricaricamento di un mysqldump di InnoDB dovrebbe richiedere 4 volte il tempo necessario per eseguire il mysqldump.
Se stai superando il rapporto 4: 1 per ricaricare un mysqldump, hai sicuramente uno dei due problemi:
- troppi indici
- indici troppo grandi a causa di colonne di grandi dimensioni
Puoi misurare la dimensione dei tuoi dati dal motore di archiviazione con questo:
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;
Verifica se gli indici sono quasi grandi quanto i dati o addirittura più grandi
Puoi anche considerare di disabilitare la registrazione binaria in questo modo:
echo "SET SQL_LOG_BIN=0;" > footable.sql
mysqldump --databases foo >> footable.sql
prima di ricaricare lo script