从MySQL中的临时表替换表中数据的最快方法

从MySQL中的临时表替换表中数据的最快方法,mysql,bulk-load,Mysql,Bulk Load,我需要“更新”从外部源收到的一些表数据(每次我收到“全部”数据时,更新一些记录的一些字段)。 没有唯一的字段或字段组合,因此我认为最好的方法是每次从数据库中删除所有数据,然后再次写入所有(现在更新的)数据。最多有1000条记录(永远不会超过这个),每个记录大约有15个短字段:文本、数字、日期时间。我正在将它写入远程数据库(所以,它很慢) 目前我正在做: delete from `table` where `date_dt` > ? 然后每行 INSERT INTO `table` ( `

我需要“更新”从外部源收到的一些表数据(每次我收到“全部”数据时,更新一些记录的一些字段)。 没有唯一的字段或字段组合,因此我认为最好的方法是每次从数据库中删除所有数据,然后再次写入所有(现在更新的)数据。最多有1000条记录(永远不会超过这个),每个记录大约有15个短字段:文本、数字、日期时间。我正在将它写入远程数据库(所以,它很慢)

目前我正在做:

delete from `table` where `date_dt` > ?
然后每行

INSERT INTO `table` ( `field_0`,`field_1`,... ) VALUES (?,?,...)
这不仅速度慢,而且最终用户可能在我插入时看不到完整的数据

我想我可以做到:

CREATE TEMPORARY TABLE `temp_table` ( ... ); -- same structure as in main table
INSERT INTO `temp_table` ( `field_0`,`field_1`,... ) VALUES (?,?,...)   -- repeat 1000x

START TRANSACTION;
DELETE FROM `table`;
INSERT INTO `table` SELECT * FROM `temp_table`;
DROP `temp_table`;
COMMIT;
这有什么意义吗?解决这个问题的更好方法是什么?

用数据填充临时表的速度并不重要,但用数据填充主表却很重要(这样用户就不会看到不完整的数据,或者看到的时间段很短)。

mysqlimport--delete
将首先截断表,然后从CSV文件加载外部数据。它的运行速度比一次插入一行快很多倍

2017年4月,我做了一个关于MySQL批量数据加载性能的演示:

注意:如果您有MySQL复制环境,请不要使用临时表解决方案。这是一种众所周知的破坏复制的方法。如果从机在创建临时表和从临时表读取的INSERT…SELECT之间重新启动,则从机将发现临时表已消失,这将导致错误并停止复制。这似乎不太可能,但最终会发生。

mysqlimport--delete
将首先截断表,然后从CSV文件加载外部数据。它的运行速度比一次插入一行快很多倍

2017年4月,我做了一个关于MySQL批量数据加载性能的演示:


注意:如果您有MySQL复制环境,请不要使用临时表解决方案。这是一种众所周知的破坏复制的方法。如果从机在创建临时表和从临时表读取的INSERT…SELECT之间重新启动,则从机将发现临时表已消失,这将导致错误并停止复制。这似乎不太可能,但最终还是会发生。

Tnx回复和演示,比尔。这是本地社区的一个小应用程序,不需要复制环境。。。我现在在想,也许我应该将所有新数据写入同一个主表,但为所有新行添加一个随机的“键”,然后在另一个表中添加“current_key”值,我将在显示数据时使用它?这样,用户可以看到旧数据,直到我“切换”键为止,他们可以立即看到所有新数据。我还有一些历史数据,我想什么时候清理就什么时候清理..Tnx回复和演示,比尔。这是本地社区的一个小应用程序,不需要复制环境。。。我现在在想,也许我应该将所有新数据写入同一个主表,但为所有新行添加一个随机的“键”,然后在另一个表中添加“current_key”值,我将在显示数据时使用它?这样,用户可以看到旧数据,直到我“切换”键为止,他们可以立即看到所有新数据。我还有一些历史数据,我可以随时清理。。