对于加载大量的数据到MySQL, LOAD DATA INFILE是迄今为止最快的选项。 不幸的是,虽然这可以在某种程度上INSERT使用忽视或更换工作,对重复密钥更新目前不支持。
然而, ON DUPLICATE KEY UPDATE
具有优于REPLACE
。 后者则删除和插入时,存在重复。 这带来了关键的管理开销。 此外,自动增量IDS不会停留在更换相同。
如何ON DUPLICATE KEY UPDATE
使用LOAD DATA INFILE时效仿?
对于加载大量的数据到MySQL, LOAD DATA INFILE是迄今为止最快的选项。 不幸的是,虽然这可以在某种程度上INSERT使用忽视或更换工作,对重复密钥更新目前不支持。
然而, ON DUPLICATE KEY UPDATE
具有优于REPLACE
。 后者则删除和插入时,存在重复。 这带来了关键的管理开销。 此外,自动增量IDS不会停留在更换相同。
如何ON DUPLICATE KEY UPDATE
使用LOAD DATA INFILE时效仿?
这些步骤可用于模拟此功能:
1)创建一个新的临时表。
CREATE TEMPORARY TABLE temporary_table LIKE target_table;
2)可选,删除所有指数从临时表来加快速度。
SHOW INDEX FROM temporary_table;
DROP INDEX `PRIMARY` ON temporary_table;
DROP INDEX `some_other_index` ON temporary_table;
3)加载CSV到临时表
LOAD DATA INFILE 'your_file.csv'
INTO TABLE temporary_table
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(field1, field2);
4)用ON DUPLICATE密钥更新复制数据
SHOW COLUMNS FROM target_table;
INSERT INTO target_table
SELECT * FROM temporary_table
ON DUPLICATE KEY UPDATE field1 = VALUES(field1), field2 = VALUES(field2);
5)拆下临时表
DROP TEMPORARY TABLE temporary_table;
使用SHOW INDEX FROM
和SHOW COLUMNS FROM
这个过程可以自动对任何给定的表。
我们可以先(两步)以取代以下单个查询中由(月)共享的过程。
1)和2),我们可以创建具有相同的参考结构,没有任何索引新表。
CREATE TEMPORARY TABLE temporary_table SELECT * FROM target_table WHERE 1 = 0;
代替..
1)创建一个新的临时表。
CREATE TEMPORARY TABLE temporary_table LIKE target_table;
2)可选,删除所有指数从临时表来加快速度。
SHOW指数从temporary_table; DROP INDEX PRIMARY
ON temporary_table; DROP INDEX some_other_index
ON temporary_table;