我有一个 1,000,000 行的 .csv 文件,我使用 mySQL Workbench 上传到一个表中,但我忘记在开始之前将日期设为 YYYY-MM-DD
,所以它们都上传为 0000-00-00
。
上传百万条记录花了将近 8 个小时,所以我真的很想不必重新做一遍,但我不知道是否有办法让我只替换那一列来 self 最初上传的同一个文件的数据,现在我已经将日期更改为正确的格式。
有人知道这是否可行吗?
编辑
发布所有内容太长了,但是:这里是 show create table
,其中取出了一些内容:
CREATE TABLE myTable
( lineID int(11) NOT NULL AUTO_INCREMENT,
1 varchar(50) DEFAULT NULL,
2 varchar(1) DEFAULT NULL,
3 int(4) DEFAULT NULL,
4 varchar(20) DEFAULT NULL,
DATE date DEFAULT NULL,
PRIMARY KEY (lineID)
) ENGINE=InnoDB AUTO_INCREMENT=634205 DEFAULT CHARSET=utf8
版本是5.6.20
最佳答案
好的。我建议使用 LOAD DATA INFILE明确地。对于那些还没有使用过它的人,在您看到它之前,暂时将其视为一个 select 语句。
这是一篇关于性能和策略的好文章,标题为 Testing the Fastest Way to Import a Table into MySQL .不要被标题或文章里面的 mysql 版本吓跑了。跳到底部并得出一些结论:
The fastest way you can import a table into MySQL without using raw files is the LOAD DATA syntax. Use parallelization for InnoDB for better results, and remember to tune basic parameters like your transaction log size and buffer pool. Careful programming and importing can make a >2-hour problem became a 2-minute process. You can disable temporarily some security features for extra performance
其中也有一些优点,主要是关于二级索引(你没有)的同行评论。对其他人来说重要的一点是在事后添加它们。
我希望这些链接有用。并且您的数据会在 10 分钟内出现(在另一个带有 LOAD DATA INFILE
的测试表中)。
一般评论
最慢的方法是在编程语言中通过 while 循环逐行执行。越来越快肯定是批处理,其中一个插入语句一次传递 200 到 1k 行。性能大幅提升的是 LOAD DATA INFILE。最快的是原始文件(我所做的,但超出了这里讨论的范围)。
关于mysql workbench,从文件中替换列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32702213/