提问人:Dima 提问时间:11/9/2023 更新时间:11/9/2023 访问量:56
我的MariaDB UPDATE中是否有任何明显的瓶颈?
Are there any obvious bottlenecks in my MariaDB UPDATE?
问:
我有一个包含 2800 万行的 MariaDB 表。我需要用列中的新值更新所有行(本地)。这是 Python 中批量更新的代码:
update_query = "UPDATE table SET column = %s WHERE `index` = %s"
%time cursor.executemany(update_query, update_data)
column
具有索引,并且是主键。index
当我使用一批 100,000 行时,运行 .我不确定这是很慢还是很正常。如果它很慢,我不知道从哪里开始加速。executemany()
答:
0赞
Barmar
11/9/2023
#1
与 不同,无法自动批处理查询,因此瓶颈是执行 100,000 次查询。INSERT
executemany()
UPDATE
请改用 .这将自动批处理。INSERT INTO ... ON DUPLICATE KEY UPDATE ...
update_query = 'INSERT INTO table (column, index) VALUES (%s, %s) ON DUPLICATE KEY UPDATE column = VALUES(column)'
%time cursor.executemany(update_query, update_data)
评论
0赞
Dima
11/9/2023
太好了,这确实将它从 50 秒缩短到 35 秒!我希望我能把它控制在5秒以上,我只是不确定我得到的时间是否合理,或者我的服务器是否有问题。但是,这仍然是一个很大的改进,谢谢!
0赞
ysth
11/9/2023
您可以尝试将所有索引和新值批量插入到临时表中,然后执行单个更新以连接该表。fwiw 如果它之前进行了 100000 次单独更新,现在正在批处理插入物,我本来预计会有比 50 到 35 秒更大的改进
0赞
Dima
11/9/2023
@ysth好的,谢谢,我会试一试。
1赞
Barmar
11/9/2023
在某些时候,您受到 I/O 速度的限制,无法实际更新所有这些行。
评论
column
column