2

嗨,我有一个巨大的非规范化 mysql 数据库,其中包含(约 1 亿)个 url(约 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,这个假设是错误的吗?

无论如何它仍然需要永远,我需要一些帮助,有没有更好的方法来处理如此大量的非标准化数据?如果我在整个 1 亿行数据库上执行 SELECT DISTINCT unNormalised.url" 并导出所有 id,然后使用 php 脚本仅将这些 id 移动到新数据库中,那会更好吗?

欢迎所有想法,我不知道如何在不花一年时间的情况下移植所有这些日期!

ps 它托管在 rds 亚马逊服务器上。

谢谢!

4

1 回答 1

0

正如MySQL 手册所说的那样,加载数据的LOAD DATA INFILE最快INSERT方法是:

LOCK TABLES url WRITE;
ALTER TABLE url DISABLE KEYS;
LOAD DATA INFILE 'urls.txt'
    IGNORE
    INTO TABLE url
    ...;
ALTER TABLE url ENABLE KEYS;
UNLOCK TABLES;

但是由于您已经将数据加载到 MySQL 中,但只需要对其进行规范化,您可以尝试:

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;

我的猜测是这INSERT IGNORE ... SELECT会比这更快,INSERT IGNORE ... SELECT DISTINCT但这只是一个猜测。

于 2012-09-29T01:25:19.930 回答