基本上我的问题是我有一张包含大约 17,000,000 种产品的大表,我需要快速对其应用大量更新。
该表有 30 列,id 设置为 int(10) AUTO_INCREMENT。
我有另一张表,该表的所有更新都存储在其中,这些更新必须预先计算,因为它们需要几天的时间来计算。该表的格式为 [product_id int(10), update_value int(10)]。
我快速发布这 1700 万个更新所采取的策略是将所有这些更新通过 ruby 脚本加载到内存中,并将它们分组到数组哈希中,以便每个 update_value 都是一个键,每个数组都是已排序的 product_id 列表。
{
150: => [1,2,3,4,5,6],
160: => [7,8,9,10]
}
然后以以下格式发布更新
UPDATE product SET update_value = 150 WHERE product_id IN (1,2,3,4,5,6);
UPDATE product SET update_value = 160 WHERE product_id IN (7,8,9,10);
我很确定我做得正确,因为使用 mysql / innodb 执行此操作的最佳方式应该是对 product_id 的排序批次发布更新。
不过,我遇到了一个奇怪的问题,当我测试更新约 1300 万条记录时,这只花了大约 45 分钟。现在,我正在测试更多的数据,约 1700 万条记录,更新花费了近 120 分钟。我本以为速度会有所下降,但没想到会下降到我看到的程度。
关于如何加快速度或是什么导致这个较大的记录集的速度变慢,有什么建议吗?
就服务器规格而言,它们非常好,大量内存/CPU,整个数据库应该适合内存,并且有足够的增长空间。