mysql 索引多怎么办_mysql – 表有8千万记录和添加索引需要超过18小时(或永远)!怎么办?...
Ok原来,这个问题不仅仅是一个简单的创建一个表,索引它,忘记了问题:)这里是我做了只是为了防止其他人面临同样的问题(我使用了IP地址的示例,但它适用于其他数据类型):问题:您的表有数百万条目,您需要快速添加索引Usecase:考虑在查找表中存储数百万个IP地址。添加IP地址不应该是一个大问题,但是在它们上创建索引需要超过14小时。案例#1:当所需的表尚未创建时CREATE TABLE IPADDR
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 :)希望这有助于。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)