Devi assolutamente scegliere il tuo approccio in base al tipo di motore... ottimizzando per MyISAM o per InnoDB .
Di recente abbiamo eseguito un benchmark confrontando diversi modi per inserire i dati e misurato il tempo da prima dell'inserimento e fino al ripristino completo di tutti gli indici. Era su un tavolo vuoto, ma abbiamo utilizzato fino a 10 milioni di righe.
MyISAM con LOAD DATA INFILE
e ALTER TABLE ... ENABLE/DISABLE KEYS
vinto a mani basse nel nostro test (su un sistema Windows 7, MySQL 5.5.27 - ora lo stiamo provando su un sistema Linux).
ENABLE e DISABLE KEYS non funzionano per InnoDB, è solo MyISAM. Per InnoDB, usa SET AUTOCOMMIT = 0; SET FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;
se sei sicuro che i tuoi dati non contengano duplicati (non dimenticare di impostarli su 1
al termine del caricamento).
Non credo che tu abbia bisogno di OPTIMIZE TABLE
dopo un inserimento in blocco - le righe MySQL vengono ordinate per inserimento e l'indice viene comunque ricostruito. Non c'è "frammentazione extra" eseguendo un inserimento collettivo.
Sentiti libero di commentare se ho commesso errori di fatto.
AGGIORNAMENTO: In base ai risultati dei nostri test più recenti e completi, il consiglio di DISABILITARE/ABILITARE i tasti è errato.
Un collega ha fatto eseguire a un programma più test diversi:una tabella con InnoDB / MyISAM precompilata e vuota, velocità di selezione e inserimento con LOAD DATA LOCAL
, INSERT INTO
, REPLACE INTO
e UPDATE
, su tabelle "dense" e "frammentate" (non sono sicuro di come, penso fosse sulla falsariga di DELETE FROM ... ORDER BY RAND() LIMIT ...
con un seme fisso quindi è ancora confrontabile) e indici abilitati e disabilitati.
L'abbiamo testato con diverse versioni di MySQL (5.0.27, 5.0.96, 5.1.something, 5.5.27, 5.6.2) su Windows e Linux (non le stesse versioni su entrambi i sistemi operativi, però). MyISAM ha vinto solo quando il tavolo era vuoto. InnoDB era più veloce quando i dati erano già presenti e generalmente funzionava meglio (tranne che per lo spazio hdd - MyISAM è più piccolo su disco).
Tuttavia, per trarne davvero vantaggio, devi testarlo tu stesso - con versioni diverse, impostazioni di configurazione diverse e molta pazienza - soprattutto per quanto riguarda le strane incongruenze (5.0.97 era molto più veloce della 5.5.27 con la stessa configurazione - noi stai ancora cercando la causa). Quello che abbiamo trovato è stato quel DISABLE KEYS
e ENABLE KEYS
sono quasi inutili e talvolta dannosi se non inizi con un tavolo vuoto.