【发布时间】:2021-11-15 19:27:29
【问题描述】:
我需要将数据从外部 Web 服务导入我的 mySQL(5.7) 数据库。 问题是,我需要将数据拆分为表格。所以例如我有表格
CREATE TABLE a (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100)
);
CREATE TABLE b (
id INT PRIMARY KEY AUTO_INCREMENT,
a_id INT,
name VARCHAR(100)
);
现在我必须在表 b 中为表 a 中的一行插入多行 (1:n) 由于我在插入之前不知道表a的id,唯一的方法是在表a中插入一行,获取最后一个id,然后将所有连接的条目插入到表b中。
但是,当我逐行插入时,我的数据库非常慢。在表a中插入大约35000行,在表b中插入120000行需要1h多。如果我在表 a 上批量插入大约 1000 行(仅用于测试而不填充表 b),它的速度令人难以置信(不到 3 分钟)
我想一定有一个解决方案可以加快导入速度。
感谢您的帮助
【问题讨论】:
-
这个答案有两个部分。第一个涉及 LAST_INSERT_ID() ,第二个涉及跨越多行插入的事务。我找不到涵盖两者的副本,所以我会回答这个。
-
什么是
a_id INT?和id INT一样吗? -
将数据从外部网络服务导入我的mySQL(5.7) 数据库 以什么形式提供要导入的数据?纯文本文件? JSON? XML?不是文件,是别的吗?
-
b.a_id是表a的外键吗?如果是这样,为什么 FK 没有在结构中定义?
标签: mysql query-optimization etl bulk-load