首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何有效地交换大表的一部分数据?

问如何有效地交换大表的一部分数据?
EN

Database Administration用户
提问于 2014-11-07 18:44:12
回答 1查看 100关注 0票数 1

我运行一个应用程序(价格比较网站),在那里,我需要更新一个每天数千万行的定价表。

基本上,我从商人那里下载的每一个产品提要都会导致数百万行要从定价表(WHERE merchantId = x)中删除,几百万个新行要插入以代替旧的。

到目前为止,我通常按顺序下载所有提要,将所有提要插入一个临时表中,然后在单个RENAME TABLE查询中将旧表替换为新表。

这迫使我一次更新所有的商人,因此我想离开这个方法,并有能力一次处理一个商人,删除所有记录WHERE merchantId = x和插入所有新记录在子秒查询。

我的第一个想法是使用按列表划分,每个商人一个分区。这将解决我一半的问题:我可以使用TRUNCATE PARTITION快速删除给定商家的所有现有价格,但问题的另一半仍然存在:如何快速插入数百万新行,而不需要停机和不必要的锁,以及不使用部分加载的表运行几分钟?

所以我在想:是否有可能创建一个与分区表结构相同的临时表,用新行填充它,一旦它完成,就用这个临时表交换定价表的一个分区吗?

任何解决这个问题的建议都会受到欢迎,包括不涉及分区的建议。我也考虑过MRG_MYISAM引擎,但我不确定它是否满足了我的需求。最后,任何存储引擎都可以用于此定价表,包括非事务性引擎。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2014-11-07 19:55:25

在深入了解了MySQL网站之后,我发现了用表交换分区和子分区,这似乎是MySQL 5.6的一个新特性:

代码语言:javascript
复制
ALTER TABLE x EXCHANGE PARTITION y WITH TABLE z;

这似乎正是我想要的。

在我的服务器上运行了一些基准之后,我发现与表交换分区并不是即时的,但速度仍然非常快:在分区表中集成的表中每170万条记录中大约有1s (正在取出的分区中的记录数量似乎对速度没有任何影响),这与我希望得到的具有几百万条记录的子秒交换非常接近。

这将与直接在分区表中插入行进行比较,在分区表中,我获得了大约27,000个插入/秒。

因此,用分区交换已经填充的表比直接插入分区表快大约60倍(对我来说,YMMV)。

甜!

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

https://dba.stackexchange.com/questions/82179

复制
相关文章

相似问题

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