Ok, ukázalo se, že tento problém byl víc než jen jednoduché vytvoření tabulky, indexování a zapomenutí problému :) Zde je to, co jsem udělal pro případ, že by někdo jiný čelil stejnému problému (použil jsem příklad IP adresy, ale funguje to pro jiné také datové typy):
Problém:Vaše tabulka obsahuje miliony položek a index potřebujete přidat opravdu rychle
Případ použití: Zvažte uložení milionů IP adres do vyhledávací tabulky. Přidání IP adres by neměl být velký problém, ale vytvoření indexu na nich trvá déle než 14 hodin.
Řešení :Rozdělte tabulku pomocí Rozdělení MySQL g strategie
Případ č. 1:Když požadovaný stůl ještě není vytvořen
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;
Případ č. 2:Když je požadovaná tabulka již vytvořena. Zdá se, že existuje způsob, jak to provést pomocí ALTER TABLE, ale ještě jsem nepřišel na správné řešení. Místo toho existuje mírně neefektivní řešení:
CREATE TABLE IPADDRESSES_TEMP(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
ipaddress BIGINT UNSIGNED,
PRIMARY KEY(id)
) ENGINE=MYISAM;
Do této tabulky vložte své IP adresy. A pak vytvořte skutečnou tabulku s oddíly:
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;
A pak konečně
INSERT INTO IPADDRESSES(ipaddress) SELECT ipaddress FROM IPADDRESSES_TEMP;
DROP TABLE IPADDRESSES_TEMP;
ALTER TABLE IPADDRESSES ADD INDEX(ipaddress)
A je to... indexování na novém stole mi na 3,2GHz stroji s 1GB RAM trvalo asi 2 hodiny :) Doufám, že to pomůže.