Хорошо, получается, что эта проблема была чем-то большим, чем просто создание таблицы, индексирование ее и забытие проблемы :) Вот что я сделал на случай, если кто-то еще столкнется с той же проблемой (я использовал пример IP-адреса, но работает и для других типов данных):
Проблема: в вашей таблице миллионы записей, и вам нужно очень быстро добавить индекс
Вариант использования: Рассмотрите возможность хранения миллионов IP-адресов в справочной таблице. Добавление IP-адресов не должно быть большой проблемой, но создание индекса для них занимает более 14 часов.
Решение : Разделите вашу таблицу, используя Разделение MySQL в 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,2 ГГц и 1 ГБ ОЗУ :) Надеюсь, это поможет.