我在生产数据库中有大量数据,我想在表中的数据仍可供最终用户使用的同时使用批量数据进行更新。更新可以是插入新行或更新现有行。具体表大约有 5000 万行,更新将在每“批处理”100k - 100 万行之间。我想做的是用低优先级插入替换。换句话说,我希望数据库能够缓慢地进行批量导入,而不会影响同时发生在同一磁盘轴上的其他查询的性能。更复杂的是,更新数据被大量索引。跨多个列的 8 个 b-tree 索引,以促进各种查找,这为导入增加了相当多的开销。
我考虑过将插入分批处理成 1-2k 记录 block ,然后让加载数据的外部脚本在每次插入之间暂停几秒钟,但这确实是一种骗人的恕我直言。另外,在 1M 记录批处理中,如果不需要的话,我真的不想添加 500-1000 2 秒暂停来增加 20-40 分钟的额外加载时间。有人对更好的方法有想法吗?
最佳答案
我使用 InnoDB 和数亿行处理过类似的情况。如果您想最大程度地降低最终用户的风险,则可以使用节流机制进行批处理。我会尝试不同的暂停时间,看看什么对你有用。对于小批量,您可以获得相应调整的好处。如果按顺序运行所有这些,您可能会发现不需要任何暂停。如果您的最终用户使用更多连接,那么他们自然会获得更多资源。
如果您使用的是 MyISAM,则 UPDATE
有一个 LOW_PRIORITY 选项.如果您将 InnoDB 与复制一起使用,请务必检查它是否不会因为额外负载而落后太多。显然它在单线程中运行,结果证明这是我们的瓶颈。因此,我们对节流机制进行了编程,以仅检查复制落后的程度并根据需要暂停。
关于mysql - 更新生产数据库中的大量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5669936/