Ok okazuje się, że ten problem był czymś więcej niż tylko prostym utworzeniem tabeli, zindeksowaniem i zapomnieniem o problemie :) Oto, co zrobiłem na wypadek, gdyby ktoś inny napotkał ten sam problem (użyłem przykładu adresu IP, ale działa dla innych również typy danych):
Problem:Twoja tabela zawiera miliony wpisów i musisz bardzo szybko dodać indeks
Przypadek zastosowania: Rozważ przechowywanie milionów adresów IP w tabeli wyszukiwania. Dodanie adresów IP nie powinno być dużym problemem, ale utworzenie na nich indeksu zajmuje ponad 14 godzin.
Rozwiązanie :Podziel tabelę na partycje za pomocą partycjonowania MySQL strategia g
Przypadek 1:Gdy żądana tabela nie została jeszcze utworzona
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;
Przypadek 2:Gdy odpowiednia tabela jest już utworzona. Wydaje się, że istnieje sposób na użycie ALTER TABLE, aby to zrobić, ale nie znalazłem jeszcze odpowiedniego rozwiązania tego problemu. Zamiast tego istnieje nieco nieefektywne rozwiązanie:
CREATE TABLE IPADDRESSES_TEMP(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
ipaddress BIGINT UNSIGNED,
PRIMARY KEY(id)
) ENGINE=MYISAM;
Wstaw swoje adresy IP do tej tabeli. A następnie utwórz rzeczywistą tabelę z partycjami:
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;
I wreszcie
INSERT INTO IPADDRESSES(ipaddress) SELECT ipaddress FROM IPADDRESSES_TEMP;
DROP TABLE IPADDRESSES_TEMP;
ALTER TABLE IPADDRESSES ADD INDEX(ipaddress)
No i proszę… indeksowanie na nowym stole zajęło mi około 2 godzin na maszynie 3,2 GHz z 1 GB pamięci RAM :) Mam nadzieję, że to pomoże.