Оказа се, че този проблем е нещо повече от просто създаване на таблица, индексиране и забравяне на проблема :) Ето какво направих, в случай че някой друг се сблъска със същия проблем (използвах пример за IP адрес, но работи за други типове данни също):
Проблем:Вашата таблица има милиони записи и трябва да добавите индекс много бързо
Случай на употреба: Помислете за съхранение на милиони IP адреси в таблица за търсене. Добавянето на IP адресите не трябва да е голям проблем, но създаването на индекс върху тях отнема повече от 14 часа.
Решение :Разделете таблицата си с помощта на MySQL's Partitionin g стратегия
Случай №1:Когато таблицата, която искате, все още не е създадена
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;
Случай №2:Когато таблицата, която искате, вече е създадена. Изглежда, че има начин да се използва ALTER TABLE, за да се направи това, но все още не съм намерил правилното решение за това. Вместо това има малко неефективно решение:
CREATE TABLE IPADDRESSES_TEMP(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
ipaddress BIGINT UNSIGNED,
PRIMARY KEY(id)
) ENGINE=MYISAM;
Въведете вашите IP адреси в тази таблица. И след това създайте действителната таблица с дялове:
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;
И накрая
INSERT INTO IPADDRESSES(ipaddress) SELECT ipaddress FROM IPADDRESSES_TEMP;
DROP TABLE IPADDRESSES_TEMP;
ALTER TABLE IPADDRESSES ADD INDEX(ipaddress)
И ето... индексирането на новата таблица ми отне около 2 часа на 3.2GHz машина с 1GB RAM :) Надявам се това да помогне.