我正在尝试从具有巨大 SSD 和太多多余空间的 MySQL AWS RDS 实例迁移到一个小的实例,而数据迁移是唯一的方法。有 330GB-450GB 范围内的四个表并在单个线程中执行 mysqldump,而通过 pv 直接通过管道传输到目标 RDS 实例估计需要大约 24 小时(以 5 mbps 复制)。
我编写了一个 bash 脚本,该脚本在末尾使用“&”和一个计算--where
参数调用多个 mysqldump,以模拟多线程。这很有效,目前使用 28 个线程只需不到一个小时。
但是,我担心将来查询时可能会降低性能,因为我不会在 auto_increment id 列的序列中插入。
有人可以确认是否会出现这种情况,或者我是否无缘无故地偏执。
您对 100 GB 的单个表使用了什么解决方案?由于某个特殊原因,我想避免使用 AWS DMS,并且绝对不想使用一段时间未维护的工具。
表格本质上是未排序的,因此在插入数据后,您在该站点上不会有任何性能损失,但我们不知道您的实例有多小,我们无法判断它会产生的影响。
您在该字段上的索引将被排序,因此会很快找到所需的行,至少比扫描孔列更快。
不高,任何原因都没有性能问题
您是正确的,它会导致聚集索引的碎片。但是,如果它是一个自动递增的列,则数据并没有真正按任何有意义的方式排序。你从一个未分类的混乱变成了一个不同分类的未分类的混乱。
一次选择/更新/读取几行?没什么大不了的——B-tree 仍然知道如何找到正确的页面,而不需要太多额外的努力。
如果您尝试通过使用自动递增列的范围来分解大型更新/删除,则会遇到问题,因为行将跨页面分布。
如果性能确实成为问题,您可以重建索引,较新版本的 MySQL 应该能够在不使表脱机的情况下这样做。
顺便说一句 - 您是否尝试按自动递增列对数据进行排序然后执行批量加载?