我有一个相当大的数据集,我需要将其导入 MySQL。我想尽可能高效地这样做,因为我需要反复这样做。这有诀窍吗?有没有比扩展的 INSERT 语句更有效的方法?
为了解决评论中的问题,原始格式是 XML,尽管我已经有一个转换器可以将其转换为 CSV 格式。我正在使用 MySQL 5.1.x,目标数据库是 InnoDB。数据之间存在关系,但我没有任何约束,并且在大多数情况下数据不够干净,无法强加它们。
我有一个相当大的数据集,我需要将其导入 MySQL。我想尽可能高效地这样做,因为我需要反复这样做。这有诀窍吗?有没有比扩展的 INSERT 语句更有效的方法?
为了解决评论中的问题,原始格式是 XML,尽管我已经有一个转换器可以将其转换为 CSV 格式。我正在使用 MySQL 5.1.x,目标数据库是 InnoDB。数据之间存在关系,但我没有任何约束,并且在大多数情况下数据不够干净,无法强加它们。
试试mysqlimport,你可以直接从 CSV 文件导入。
我会阅读mysql手册,我在考虑 INSERT AFTER ,但是 LOAD DATA INFILE 看起来很有趣“快了 20 倍”......
有一个名为Pentaho Data Integration的开源 ETL 工具,它有一个 mysql 批量加载选项(在设计视图中的实验文件夹下)。您还可以使用他们的 CSV 输入和表输出步骤以与平台无关的方式快速加载数据。如果您需要在加载数据之前对数据进行任何处理,您可以在此程序中对该逻辑进行编码。
使用
/*!40000 ALTER TABLE tbl_name DISABLE KEYS */;
和/*!40000 ALTER TABLE tbl_name ENABLE KEYS */;
围绕每个表的 INSERT 语句。这将确保在所有行都存在之后创建非唯一索引,而不是尝试逐个构建它们。
即使是批量“插入......”也不应该花费太长时间。我导出了一个 200MB 的新 JIRA 数据库,并在大约 30 秒内加载到一个原始数据库中。
您想使用LOAD DATA语句。如果您没有 sudo privs,您还想使用 LOCAL 选项,以便您可以从放置数据的任何位置加载数据。LOAD DATA 在我的 Dell T5600 上以惊人的速度吸入数据,大约每 2-3 分钟 1 GB。我刚刚在 1 小时 13 分钟内完成了大约 3700 万条记录的 8GB 负载。