【问题标题】:Ways to quickly split big table into shards快速将大表拆分为分片的方法
【发布时间】:2011-12-12 08:34:30
【问题描述】:

假设我有一个很大的 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 天。

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

【问题讨论】:

    标签: mysql innodb partitioning sharding


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这会比使用 INSERT/SELECT 更快吗?如果是这样,请发布一些示例代码来支持您的回答。
    【解决方案3】:

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

    加快导入速度的技巧:

    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 作为中间格式是个坏主意。

    【讨论】:

      猜你喜欢
      • 2013-07-28
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      • 2019-04-24
      • 2013-10-19
      相关资源
      最近更新 更多