如何快速将大表分成碎片

时间:2011-12-12 08:34:30

标签: mysql innodb partitioning sharding bigtable

假设我有一个很大的MySQL InnoDB表(100Gb),并希望在分片之间分割这些数据。表格如下Post(id: int, user_id: int, body: text, ...)。表格被严格索引。服务器托管在AWS上并使用EBS磁盘。

应根据user_id键执行拆分。例如。 id为1..100的用户帖子应该存储在shard1上,id为101..200的用户帖子应该存储在shard2上,依此类推。

我已经尝试了INSERT .. SELECT,但估算表明,这需要5天时间。

那么,有没有关于如何在合理的时间内吐出数据的想法?

3 个答案:

答案 0 :(得分:0)

复制表结构,同时删除所有INDEX定义,并使用INSERT-SELECT填充它们。完成后,使用单个ALTER TABLE语句添加必要的索引。

答案 1 :(得分:0)

也许你可以使用存储过程来读取每条记录并复制到不同的分片。

答案 2 :(得分:0)

瓶颈是磁盘子系统的写入速度。

加速进口的诀窍:

MyISAM不是事务性的,单线程插入的速度要快得多。尝试加载到MyISAM,然后将表更改为INNODB 使用ALTER TABLE .. DISABLE KEYS逐行避免索引更新(仅限MyISAM) 将bulk_insert_buffer_size设置为高于插入大小(仅限MyISAM) 设置unique_checks = 0,以便不检查唯一约束。

如需进一步调整,请参阅以下内容: MYSQL Huge SQL Files Insertion | MyISAM speed suddenly slow down for Insertions (strange issue)

注意:如果原始表具有外键约束,则使用MyISAM作为中间格式是一个坏主意。