java - 从大型 CSV 文件更新、插入和删除大型 MySQL
问题描述
我们每天收到大约 1000 万行 CSV 文件中的数据。此 CSV 文件包含大约 5,000 种产品的位置和价格数据。
有时 CSV 会更新,有时会保持不变。CSV 中的数据是事实的来源(例如,我们总是希望在应用程序中使用的数据)。
这是 CSV 的一个片段:
UUID,Location,Price
AAA,Melbourne,21.96
AAA,Sydney,32.43
BBB,Melbourne,23.43
BBB,Adelaide,32.43
我们需要将最新数据存储在 MySQL 数据库之外。
以下是需要如何存储这些数据的示例:
位置_数据:
ID,ProductID,Location,Price
1,1,Melbourne,21.96
2,1,Sydney,32.43
3,2,Melbourne,23.43
4,2,Adelaide,32.43
产品:
ID,UUID (and other fields not relevant to this question)
1,AAA
2,BBB
对于初始导入,我们使用 MySQL LOAD DATA IN FILE
。这是相当快的。这是过程:
- 我们从数据库中获取所有产品
- 我们将 CSV 的每一行与数据库中的产品进行匹配
- 然后我们生成一个新的 CSV 文件,我们可以直接将其导入 location_data 表。
更新的 CSV 文件可能包含新的位置、更新的价格或不再存在的位置。我们需要UPDATE
,INSERT
并且DELETE
在所有这些情况下。
继续讨论这个问题......我们正在努力解决如何在收到已更改的新 CSV 文件时快速更新数据库。
不幸的是,我们只提出了两个不适合我们的选项:
从数据库中获取数据并对照 CSV 文件(逐行)检查它。获取这么多数据非常慢,然后将其与 CSV 进行比较也非常慢。
删除所有数据库数据并重新导入。不幸的是,这是不可能的(我们需要保留对数据所做更改的历史记录。当我们删除并插入整个数据集时,我们会丢失该历史记录)。
关于我们如何设法加快速度的任何建议?
解决方案
推荐阅读
- python - 从 json 中删除 \r
- ios - 条码不生成
- javascript - javascript条形图条不显示
- multithreading - 多线程:多线程收集信息,一个工作
- r - 以编程方式选择 data.table 中的列名
- php - 与准备好的语句和 LIKE 一起使用时,SHOW COLUMNS 返回错误
- excel - 单元格中的 Excel 条件值
- javascript - 将画布屏幕截图保存到文件夹中
- julia - 计算组合的 Julia 函数是什么(n 选择 k)?
- angular - 调整 Model/FormControl 值以在 UI 控件中以不同方式显示的最佳方法是什么?