mariadb 在MySQL中更新数百万行

xhv8bpkk  于 2022-11-23  发布在  Mysql
关注(0)|答案(2)|浏览(215)

我试图更新MySQL InnoDB表中的数百万行,但得到以下错误:

ERROR 1206 (HY000): The total number of locks exceeds the lock table size

正如我所读到的,问题出在行锁定和大量的行上。所以我试图通过锁定表本身和按LIMIT拆分查询来避免行锁定。我还用innodb_buffer_pool_size = 4G更改了配置。但总的来说,这不起作用,错误仍然出现。

MariaDB [data]> LOCK TABLES contacts WRITE;
Query OK, 0 rows affected (0.000 sec)

MariaDB [data]> UPDATE `contacts` SET `field1` = `field2` WHERE `field1` = 0 AND `field2` > 0 LIMIT 1000000;
ERROR 1206 (HY000): The total number of locks exceeds the lock table size

我做错了什么?
提前谢谢你。我不知道为什么会这样。

zvokhttg

zvokhttg2#

(This听起来像是重复的。)

  • 一次只能批1000个
  • 拥有INDEX(field1, field2, id)
  • Walk through the table in id order. More discussion here: http://mysql.rjweb.org/doc.php/deletebig#deleting_in_chunks

最后一个建议与

SELECT ... WHERE id > $leftoff ORDER BY id LIMIT 1000,1

连同

UPDATE ... WHERE id > $leftoff AND id <= $newleftoff AND $filter

避免一次接触超过1000行--首先限制要考虑的行,然后再处理它们。而且,由于表在PRIMARY KEY(id)上"聚集",因此I/O非常少。它接触任何块的次数不会超过两次(一次用于读取,一次用于写入,如果需要的话)。即使对于大型表和很小的buffer_pool,它也是高效的。

相关问题