官方建议:
-
InnoDB Tables
-
If you are deleting many rows from a large table, you may exceed the lock table size for an InnoDB table. To avoid this problem, or simply to minimize the time that the table remains locked, the following strategy (which does not use DELETE at all) might be helpful:
-- 1.Select the rows not to be deleted into an empty table that has the same structure as the original table:
INSERT INTO t_copy SELECT * FROM t WHERE ... ;
-- 2.Use RENAME TABLE to atomically move the original table out of the way and rename the copy to the original name:
RENAME TABLE t TO t_old, t_copy TO t;
-- 3.Drop the original table:
DROP TABLE t_old;
大概意思:
你要detele大表中的多行,则可能导致锁定的表的数据量太多,innodb_buffer_pool没有足够空间来执行。为了避免这个问题,或者为了最小化减少持有表锁的时间,你还不如创建一张同样结构的表,把不删除的数据放里面,然后重命名原始表,并给新表命名为原始表的原始表名,这样还快一点
mysql会报错"ERROR 1206 (HY000): The total number of locks exceeds the lock table size",InnoDB引擎会因需要锁的行太多而抛出这个错误。解决就加大innodb_buffer_pool_size