gpt4 book ai didi

mysql - 重构庞大的非规范化mysql数据库

转载 作者:行者123 更新时间:2023-11-30 23:27:14 26 4
gpt4 key购买 nike

您好,我有一个巨大的非规范化 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 amazon 服务器上。

谢谢!

最佳答案

作为MySQL Manual states LOAD DATA INFILEINSERT 更快,加载数据的最快方法是:

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 更快,但这只是一个猜测。

关于mysql - 重构庞大的非规范化mysql数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12648535/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com