我运行一个应用程序(价格比较网站),在那里,我需要更新一个每天数千万行的定价表。
基本上,我从商人那里下载的每一个产品提要都会导致数百万行要从定价表(WHERE merchantId = x)中删除,几百万个新行要插入以代替旧的。
到目前为止,我通常按顺序下载所有提要,将所有提要插入一个临时表中,然后在单个RENAME TABLE查询中将旧表替换为新表。
这迫使我一次更新所有的商人,因此我想离开这个方法,并有能力一次处理一个商人,删除所有记录WHERE merchantId = x和插入所有新记录在子秒查询。
我的第一个想法是使用按列表划分,每个商人一个分区。这将解决我一半的问题:我可以使用TRUNCATE PARTITION快速删除给定商家的所有现有价格,但问题的另一半仍然存在:如何快速插入数百万新行,而不需要停机和不必要的锁,以及不使用部分加载的表运行几分钟?
所以我在想:是否有可能创建一个与分区表结构相同的临时表,用新行填充它,一旦它完成,就用这个临时表交换定价表的一个分区吗?
任何解决这个问题的建议都会受到欢迎,包括不涉及分区的建议。我也考虑过MRG_MYISAM引擎,但我不确定它是否满足了我的需求。最后,任何存储引擎都可以用于此定价表,包括非事务性引擎。
发布于 2014-11-07 19:55:25
在深入了解了MySQL网站之后,我发现了用表交换分区和子分区,这似乎是MySQL 5.6的一个新特性:
ALTER TABLE x EXCHANGE PARTITION y WITH TABLE z;这似乎正是我想要的。
在我的服务器上运行了一些基准之后,我发现与表交换分区并不是即时的,但速度仍然非常快:在分区表中集成的表中每170万条记录中大约有1s (正在取出的分区中的记录数量似乎对速度没有任何影响),这与我希望得到的具有几百万条记录的子秒交换非常接近。
这将与直接在分区表中插入行进行比较,在分区表中,我获得了大约27,000个插入/秒。
因此,用分区交换已经填充的表比直接插入分区表快大约60倍(对我来说,YMMV)。
甜!
https://dba.stackexchange.com/questions/82179
复制相似问题