Ok原来,这个问题不仅仅是一个简单的创建一个表,索引它,忘记了问题:)这里是我做了只是为了防止其他人面临同样的问题(我使用了IP地址的示例,但它适用于其他数据类型):
问题:您的表有数百万条目,您需要快速添加索引
Usecase:考虑在查找表中存储数百万个IP地址。添加IP地址不应该是一个大问题,但是在它们上创建索引需要超过14小时。
案例#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 :)希望这有助于。