【发布时间】:2018-01-22 10:54:55
【问题描述】:
我有一个表“数据”,其中包含大约 100,000,000 条记录。 我已经向它添加了一个新列“batch_id”(整数)。
在应用程序层,我正在为 100,000,000 条记录中的每条记录更新 batch_id,每批 10,000 条记录(对于 10k,batch_id 始终相同)。
我正在做这样的事情(应用层伪代码):
loop {
$batch_id = $batch_id + 1;
mysql.query("UPDATE data SET batch_id='$batch_id' WHERE batch_id IS NULL LIMIT 10000");
}
我在 batch_id 列上有一个索引。
一开始,这个更新语句需要大约 30 秒。我现在已经完成了表的一半,而且它变得越来越慢。目前,相同的语句大约需要 10 分钟(!)。它已经到了不再可行的地步,因为以当前速度更新整个表需要一个多月的时间。
我可以做些什么来加快它,为什么 MySQL 在表的末尾变得越来越慢? 主键索引有帮助吗?
【问题讨论】:
-
前 10,000 行 “~30 秒”?
result_id是什么? -
你能解释一下 SQL 吗?
-
这是什么语言?看起来有点 Ruby,但它使用全局变量。
-
@PaulSpiegel - 抱歉打错了,result_id == batch_id
-
我遇到了完全相同的问题,即显着减少了 mySQL 的更新时间。我也有 100,000,000 条记录要更新。我不明白为什么系统会因为我根据主键进行更新而变慢,并且表大小始终保持不变
标签: mysql performance innodb query-performance