Ok, det visar sig att det här problemet var mer än att bara skapa en tabell, indexera den och glömma problemet :) Här är vad jag gjorde ifall någon annan stöter på samma problem (jag har använt ett exempel på IP-adress men det fungerar för andra datatyper också):
Problem:Din tabell har miljontals poster och du måste lägga till ett index väldigt snabbt
Användning: Överväg att lagra miljontals IP-adresser i en uppslagstabell. Att lägga till IP-adresser borde inte vara ett stort problem men att skapa ett index på dem tar mer än 14 timmar.
Lösning :Partitionera din tabell med MySQL:s partitionering g-strategi
Fall #1:När tabellen du vill ha inte har skapats ännu
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;
Fall 2:När tabellen du vill ha redan är skapad. Det verkar finnas ett sätt att använda ALTER TABLE för att göra detta, men jag har ännu inte hittat en korrekt lösning för detta. Istället finns det en något ineffektiv lösning:
CREATE TABLE IPADDRESSES_TEMP(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
ipaddress BIGINT UNSIGNED,
PRIMARY KEY(id)
) ENGINE=MYISAM;
Infoga dina IP-adresser i den här tabellen. Och skapa sedan den faktiska tabellen med partitioner:
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;
Och så till sist
INSERT INTO IPADDRESSES(ipaddress) SELECT ipaddress FROM IPADDRESSES_TEMP;
DROP TABLE IPADDRESSES_TEMP;
ALTER TABLE IPADDRESSES ADD INDEX(ipaddress)
Och där har du... indexering på det nya bordet tog mig ungefär 2 timmar på en 3,2 GHz maskin med 1 GB RAM :) Hoppas detta hjälper.