首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从MySQL中的临时表替换表中数据的最快方法

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

Stack Overflow用户
提问于 2017-08-19 21:16:25
回答 1查看 1.2K关注 0票数 1

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

目前我正在做:

代码语言:javascript
复制
delete from `table` where `date_dt` > ?

然后每一行

代码语言:javascript
复制
INSERT INTO `table` ( `field_0`,`field_1`,... ) VALUES (?,?,...)

这不仅很慢,而且可能在我还在插入的时候,最终用户可能看不到完整的数据。

我想我能做到:

代码语言:javascript
复制
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;

,这有什么意义吗?解决这个问题的更好方法是什么?

用数据填充临时表的速度并不重要,但是用数据填充主表是(因此用户不会看到不完整的数据,或者他们所做的时间很短)。

EN

回答 1

Stack Overflow用户

发布于 2017-08-19 21:33:19

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

请参阅https://dev.mysql.com/doc/refman/5.7/en/mysqlimport.html

我在2017年4月做了一次关于MySQL:https://www.slideshare.net/billkarwin/load-data-fast大容量数据加载性能的介绍

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45776357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档