重构庞大的非标准化mysql数据库

时间:2012-09-28 23:22:22

标签: mysql database database-design database-schema

您好我有一个巨大的非标准化mysql数据库,其中包含(约1亿个)网址(约占20%),分为相同的拆分表,每个包含1300万行。

我想将url移动到同一mySql服务器上的规范化数据库中。

旧数据库表未标准化,并且url没有索引 它看起来像这样:

entry{id,data,data2, data3, data4, possition,rang,url}

我要把它分成多个表格。

url{id,url}
data{id,data}
data1{id,data}
etc

我做的第一件事是

INSERT IGNORE INTO newDatabase.url (url)
SELECT DISTINCT unNormalised.url FROM oldDatabase.unNormalised

但是“SELECT DISTINCT unNormalised.url”(1300万行)需要很长时间,而且我认为自“INSERT IGNORE INTO”也进行了比较,只需做一个快速的

INSERT IGNORE INTO newDatabase.url (url)
SELECT unNormalised.url FROM oldDatabase.unNormalised

没有DISTINCT,这个假设是错误的吗?

任何方式它仍然需要永远,我需要一些帮助,有没有更好的方法来处理这么大量的非标准化数据? 如果我在整个100万行数据库上执行SELECT DISTINCT unNormalised.url并导出所有id,然后将那些id只移动到新数据库,让我们说一个php脚本,那会是最好的吗?

所有想法都受到欢迎,我不知道如何在没有花费一年的情况下将所有这些日期移植!

ps它托管在rds amazon服务器上。

谢谢!

1 个答案:

答案 0 :(得分:0)

LOAD DATA INFILE INSERTLOCK TABLES url WRITE; ALTER TABLE url DISABLE KEYS; LOAD DATA INFILE 'urls.txt' IGNORE INTO TABLE url ...; ALTER TABLE url ENABLE KEYS; UNLOCK TABLES; 更快,加载数据的最快方式是:

LOCK TABLES url WRITE;
ALTER TABLE url DISABLE KEYS;
INSERT IGNORE INTO url (url)
    SELECT url FROM oldDatabase.unNormalised;
ALTER TABLE url ENABLE KEYS;
UNLOCK TABLES;

但是既然您已将数据加载到MySQL中,但只需要将其标准化,您可以尝试:

INSERT IGNORE ... SELECT

我的猜测是INSERT IGNORE ... SELECT DISTINCT会比{{1}}更快,但这只是猜测。