【问题标题】:Fast load data into file split to tables connect by id快速将数据加载到文件中,并按 id 连接到表中
【发布时间】:2012-05-17 13:43:05
【问题描述】:

拥有一个使用 InnoDB 和外键的 MySQL 数据库...

我需要从一个巨大的 CSV 文件中导入 100MiB 的数据并将其拆分为两个表,并且记录必须如下所示

表格1 id|数据|数据2 表2 id|table1_id|data3

其中Table2.table1_id 是引用Table1.id 的外键。

一个实例的 MySQL 序列如下所示

  1. 将文件加载到临时表中
  2. 然后从临时表插入到需要的地方
  3. 获取最后一个插入 ID
  4. 使用此参考 ID 执行最后一个插入组...

太慢了……

如何使用文件加载到...?任何真正的想法与高速结果?

【问题讨论】:

  • 2.步骤 - 4. 步骤当然是在一个循环中 :) 并且作为参考 - 8000 记录/秒是慢...需要至少 20 000 记录/秒

标签: mysql file load


【解决方案1】:

您可以暂时将data3 列添加到Table1(我还添加了一个done 列来区分源自CSV 的记录与那些已经存在/源自其他地方的记录):

ALTER TABLE Table1
  ADD COLUMN data3 TEXT,
  ADD COLUMN done BOOLEAN DEFAULT TRUE;

LOAD DATA
  INFILE '/path/to/csv'
  INTO TABLE Table1 (data, data2, data3)
  SET done = FALSE;

INSERT
  INTO Table2 (table1_id, data3)
  SELECT (id, data3) FROM Table1 WHERE NOT done;

ALTER TABLE Table1
  DROP COLUMN data3,
  DROP COLUMN done;

【讨论】:

  • 对不起,但这远不是一个解决方案...从逻辑上讲,表的结构不能定期更改...这是一个将一直被调用的过程,因为这样的负载文件将每天上传...表格的结构已设置,解决方案必须处理...这只是结构的一个简单示例,实际结构将需要 A4 页面来复制创建代码......那么当我有2个必须通过外键链接的不同表时,是否有任何真正的想法如何在文件函数中使用加载数据?我以为我说的很清楚......对不起
  • @user663184:我认为表的结构不能(暂时)更改,因为可能存在并发的 SELECT * FROM Table1INSERT INTO Table1 VALUES ... 查询,如果出现意外情况,可能会导致客户端应用程序出现问题两个额外的列?为了避免这些问题,您可以通过一个临时表(但如果可能有来自其他地方的并发 INSERT 语句,您需要在 LOADINSERT ... SELECT 期间锁定 Table1 - 在这种情况下,您可以以及按照最初的建议执行上述操作时锁定Table1...)
  • PS:如果这是您可能会定期执行的操作,您可以只将附加列设为永久和UPDATE Table1 SET done = TRUE WHERE done = FALSE 而不是第二个ALTER TABLE 命令(尽管您需要这样做它在事务中以保持原子性)。
猜你喜欢
  • 2016-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 2016-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多