2011-11-21 19 views
18

Nel mio database MySQL, c'è una tabella che contiene 2.000.000 di record. Ora, vorrei inserire altri 6.000.000 di nuovi record in questa tabella.MySQL disabilita e abilita le chiavi

Per accelerare l'inserimento, ho anche se dovrei usare disabilitare/abilitare i tasti come segue:

ALTER TABLE cars DISABLE KEYS; 

INSERT INTO cars ... 
... 
... 
INSERT INTO cars ... 

ALTER TABLE search_all_values ENABLE KEYS; 

OPTIMIZE TABLE cars; 

Ma io in qualche modo la sensazione che, il abilitare/disabilitare i tasti avrebbe più senso da utilizzare per la tabella vuota inserimento.

Mentre nel mio caso, ho già 2.000.000 di record nella tabella, quando ENABLE KEYS, mysql creerà nuovamente tutti gli indici (inclusi i record esistenti e nuovi record aggiunti) che probabilmente non produrranno un inserimento di dati efficiente come un intero nel mio caso. Come ricreare tutti gli indici ci vorrà molto tempo e probabilmente così fa OPTIMIZE TABLE

Vorrei chiedere il vostro parere su ho ragione e come posso avere un inserimento dei dati efficiente nel mio caso?

+0

Sei certo che l'aggiornamento delle chiavi sia un collo di bottiglia? – abcde123483

+1

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

+0

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

risposta

1

L'indicizzazione delle nuove chiavi richiederà un po 'di tempo. Spetta a te decidere se vuoi che venga eseguito tutto in una volta (disattivandolo per primo) o uno alla volta (mantenendolo così com'è e facendolo indicizzare mentre ogni record viene aggiunto)

I ' Vai per quest'ultimo, non disabilitando le tue chiavi. Se temi di mettere troppo a dura prova il server, puoi provare a inserire i batch, ad es. solo una certa quantità di inserti al minuto.

+0

@ mlitn, che ne dici di ottimizzare la tabella dopo l'inserimento dei dati, questo passaggio è necessario? – Mellon

39

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.

+1

Questa è una risposta davvero fantastica. Grazie per la tua approfondita ricerca! – pinkgothic

+0

Hmm, un buon sforzo, ma dubito della conclusione in quanto le grandi variazioni dei risultati dei test non sono indicativi del fatto che ci siano ** un sacco ** di fattori sconosciuti qui? – Pacerier

Problemi correlati