完成此操作的最快方法是抓取一大块(数千行),将其分解为 CSV,然后执行LOAD DATA INFILE。LOCAL
由于服务器设置,某些环境无法使用 LOAD DATA LOCAL INFILE ....部分。上面的链接有另一个链接,它指出:
从文本文件加载表时,使用 LOAD DATA INFILE。这通常比使用 INSERT 语句快 20 倍。请参见第 14.2.6 节,“LOAD DATA INFILE 语法”。
我发现这很容易成为事实。
当然,速度慢但比单个插入更好的是用一个语句将多个插入放在一起:
insert myTable (col1,col2) values ('a1','b1'), ('a2','b2'), ('a3','b3');
所以在上面的例子中,一个语句插入了 3 行。通常为了速度,最好一次播放 500 到 1000 行(而不是 3 行)。这一切都取决于该插入语句的字符串大小,具体取决于您的架构。
安全问题:您需要对 2 级 sql 注入攻击的可能性保持警惕,尽管这看起来很牵强。但这是可能的。
以上所有内容可能看起来微不足道,但对于一个轶事示例和 UX 痛苦评论,我提供以下内容。我有一个 ac# 应用程序,它可以从 Stackoverflow 中提取问题并保存它们的指标。不是正文部分或答案,而是标题和许多计数和日期时间。我每次在我的数据库中插入 1000 个问题(或执行 aninsert ignore
或 an insert on duplicate key update
)。在将其转换为之前,LOAD DATA INFILE
每 1000 次使用重复使用的 Prepared Statement 进行 c#/mysql 绑定大约需要 50 秒。转换后LOAD DATA INFILE
(包括工作表的截断,csv写入,插入语句),每1000行大约需要1.5秒。