Ok si scopre che questo problema era più di un semplice creare una tabella, indicizzarla e dimenticare il problema :) Ecco cosa ho fatto nel caso qualcun altro dovesse affrontare lo stesso problema (ho usato un esempio di indirizzo IP ma funziona per altri anche i tipi di dati):
Problema:la tua tabella ha milioni di voci e devi aggiungere un indice molto velocemente
Caso d'uso: Prendi in considerazione l'archiviazione di milioni di indirizzi IP in una tabella di ricerca. L'aggiunta degli indirizzi IP non dovrebbe essere un grosso problema, ma la creazione di un indice su di essi richiede più di 14 ore.
Soluzione :partiziona la tabella utilizzando Partitionin di MySQL g strategia
Caso n. 1:quando la tabella che desideri non è ancora stata creata
CREATE TABLE IPADDRESSES(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
ipaddress BIGINT UNSIGNED,
PRIMARY KEY(id, ipaddress)
) ENGINE=MYISAM
PARTITION BY HASH(ipaddress)
PARTITIONS 20;
Caso n. 2:quando la tabella che desideri è già stata creata. Sembra esserci un modo per usare ALTER TABLE per farlo, ma non ho ancora trovato una soluzione adeguata per questo. Invece, c'è una soluzione leggermente inefficiente:
CREATE TABLE IPADDRESSES_TEMP(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
ipaddress BIGINT UNSIGNED,
PRIMARY KEY(id)
) ENGINE=MYISAM;
Inserisci i tuoi indirizzi IP in questa tabella. E quindi crea la tabella vera e propria con le partizioni:
CREATE TABLE IPADDRESSES(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
ipaddress BIGINT UNSIGNED,
PRIMARY KEY(id, ipaddress)
) ENGINE=MYISAM
PARTITION BY HASH(ipaddress)
PARTITIONS 20;
E poi finalmente
INSERT INTO IPADDRESSES(ipaddress) SELECT ipaddress FROM IPADDRESSES_TEMP;
DROP TABLE IPADDRESSES_TEMP;
ALTER TABLE IPADDRESSES ADD INDEX(ipaddress)
E il gioco è fatto... l'indicizzazione sulla nuova tabella mi ha impiegato circa 2 ore su una macchina a 3,2 GHz con 1 GB di RAM :) Spero che questo aiuti.