In primo luogo, la definizione della tabella potrebbe fare una grande differenza qui. Se non sono necessari i valori NULL
nelle colonne, definirli NOT NULL
. Ciò farà risparmiare spazio nell'indice e presumibilmente tempo durante la sua creazione.
CREATE TABLE x (
i INTEGER UNSIGNED NOT NULL,
j INTEGER UNSIGNED NOT NULL,
nu DOUBLE NOT NULL,
A DOUBLE NOT NULL
);
Per quanto riguarda il tempo necessario per creare gli indici, questo richiede una scansione di tabella e mostrerà come REPAIR BY SORTING
. Dovrebbe essere più veloce nel tuo caso (vale a dire un enorme set di dati) per creare una nuova tabella con gli indici richiesti e inserire i dati in essa, in quanto ciò eviterà l'operazione REPAIR BY SORTING
mentre gli indici sono costruiti in sequenza sull'inserto. C'è un concetto simile spiegato in this article.
CREATE DATABASE trans_clone;
CREATE TABLE trans_clone.trans LIKE originalDB.trans;
ALTER TABLE trans_clone.trans ADD KEY idx_A (A);
Poi lo script l'inserto in pezzi (come da articolo), o eseguire il dump dei dati utilizzando MYSQLDUMP
:
mysqldump originalDB trans --extended-insert --skip-add-drop-table --no-create-db --no-create-info > originalDB .trans.sql
mysql trans_clone < originalDB .trans.sql
Questo inserirà i dati, ma non richiederà ricostruzione di un indice (l'indice è costruito come ogni riga inserita) e dovrebbe essere completato molto più velocemente.
si potrebbe desiderare di guarda in split (database sharding) il tuo tavolo –