【发布时间】:2015-08-31 03:23:07
【问题描述】:
我正在寻找在 SQL 中实现大数据更新/插入的最佳方法。我的特殊情况是使用 MySQL 5.6,但理论上 SQL 的版本并不那么重要。
我正在下载一个大型 CSV 文件,其中填充了我需要转储到 MySQL 表中的数据。我的应用程序解析 CSV 并准备插入数据库。
我需要该表是每次传入的数据 (CSV) 的精确副本,而不是每次都添加到末尾。我正在寻找实现这一目标的最佳方法。
就我目前的 SQL 功能而言,我认为最好每次都简单地截断表并在数据通过时填充它,但我现在不确定这是否比索引列和使用 @987654324 更好@。
我的问题如下:
-
最好是截断数据然后将数据插入空表,还是更好地找到数据差异并使用
INSERT .. ON DUPLICATE KEY仅更新应用程序发现数据差异的行 在此之后,最好为每行数据格式化单个 SQL
UPDATE/INSERT查询并将它们发送到服务器。或者最好是格式化一个包含所有数据的非常大的查询,或者可能将较大的查询拆分为更易于管理的内容,以免服务器超时。
表中大约有 100k 行正在通过。目前,我在运行任何 INSERT 之前截断表。然后我将这些行分成 10 个不同的集合,并对数据库运行 10 个大型 INSERT 查询。我唯一担心的是我对表锁定知之甚少,并且不确定拆分这些是否真的能取得任何重大意义。
我在这里问这个问题的原因是因为我的监视器中的数据库使用图显示峰值,我认为拥有更稳定的数据流可能会更好,并试图弄清楚如何实现这一点。
我知道这只是磁盘写入,但所有图表看起来或多或少都相同,有很多尖峰且没有一致性。
【问题讨论】:
-
您好,我建议您使用SQLyog,其中您可以将“结构和数据”或.CSV 格式的“数据”导入表格。建议先导入表结构,再导入数据,导入效率高。您还可以指定一次导入的数据块以避免连接丢失。
-
感谢马修的建议。我实际上已经使用了 MySQL 工作台,它在将 CSV 导入表时具有相同的功能,但是该过程需要自动并内置到最终用户的程序中:) 一切都很好,下面的迈克尔(标记为答案)给了我我想要的需要。无论如何感谢您的有用建议!