Devi assolutamente scegliere il tuo approccio in base al tipo di motore ... ottimizzazione for MyISAM o for InnoDB.
Recentemente abbiamo eseguito un benchmark confrontando diversi modi per inserire dati e misurato il tempo prima dell'inserimento e fino a quando tutti gli indici sono stati completamente ripristinati. Era su un tavolo vuoto, ma abbiamo usato fino a 10 milioni di righe.
MyISAM con LOAD DATA INFILE
e ALTER TABLE ... ENABLE/DISABLE KEYS
ha vinto le mani 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 con InnoDB, è solo MyISAM. Per InnoDB, utilizzare SET AUTOCOMMIT = 0; SET FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;
se si è sicuri che i propri dati non contengano duplicati (non dimenticare di impostarli su 1
al termine del caricamento).
Non penso che sia necessario OPTIMIZE TABLE
dopo un inserimento di massa - Le righe MySQL sono ordinate per inserimento e l'indice viene comunque ricostruito. Non c'è "extra frammentazione" facendo un inserto di massa.
Sentitevi liberi di commentare se ho commesso errori di fatto.
AGGIORNAMENTO: In base ai nostri risultati di test più recenti e completi, il suggerimento sui tasti DISABLE/ENABLE è errato.
Un collega aveva un programma di eseguire più test diversi - un tavolo con InnoDB/MyISAM pre-riempita e vuota, la selezione e inserimenti accelera con LOAD DATA LOCAL
, INSERT INTO
, REPLACE INTO
e UPDATE
, su "densi" e le tabelle "frammentati" (io sono Non so bene come, penso che fosse lungo le linee di DELETE FROM ... ORDER BY RAND() LIMIT ...
con un seme fisso quindi è ancora comparabile) e gli indici abilitati e diasabled.
Abbiamo testato con diverse versioni di MySQL (5.0.27, 5.0.96, 5.1.qualcosa, 5.5.27, 5.6.2) su Windows e Linux (non le stesse versioni su entrambi i sistemi operativi). MyISAM ha vinto solo quando il tavolo era vuoto. InnoDB era più veloce quando i dati erano già presenti e generalmente si comportava meglio (ad eccezione di hdd-space - MyISAM è più piccolo sul disco).
Tuttavia, per trarne il massimo vantaggio, è necessario testarlo da soli - con diverse versioni, diverse impostazioni di configurazione e molta pazienza - soprattutto per quanto riguarda le strane incongruenze (5.0.97 è stato molto più veloce di 5.5.27 con il stessa configurazione - stiamo ancora cercando la causa). Quello che abbiamo trovato era che DISABLE KEYS
e ENABLE KEYS
sono prossimi a inutili e talvolta dannosi se non si inizia con una tabella vuota.
Sei certo che l'aggiornamento delle chiavi sia un collo di bottiglia? – abcde123483
Questa è la mia preoccupazione e c'è qualcuno che ha la stessa preoccupazione qui http://forums.mysql.com/read.php?21,68820,68939#msg-68939 – Mellon
Ad ogni modo, quegli indici saranno creati una volta che li abiliti di nuovo . Prova a fare un inserto di blocco piuttosto che riga/riga e anche fare una statistica di aggiornamento e vedere se questo migliora nulla. – Rahul