Mysql/Mariadb 删除查询是事务性的吗?及其巨大的表现。行数?
Posted
技术标签:
【中文标题】Mysql/Mariadb 删除查询是事务性的吗?及其巨大的表现。行数?【英文标题】:Is Mysql/Mariadb delete Query transactional? and its performance for huge no. of rows? 【发布时间】:2018-09-10 18:58:35 【问题描述】:Q1:删除查询是否在 mysql/mariadb 中作为整个事务运行。因此,如果我们有 100 万行要删除,mysql/mqriadb 服务器会将其作为一个整体删除,或者如果在删除某些行后出现问题,已删除的行将被恢复。
Q2:我们是否需要在单个删除查询中删除行(无论需要删除多少行),还是需要在删除查询中设置限制并批量执行删除。如果需要批处理多少(要删除的行数),我们应该考虑一下。
【问题讨论】:
您的第一个问题是重复的:***.com/questions/17856370/… 对于第二个问题,这实际上取决于您计划删除多少条记录。您真的认为您会经常需要删除数百万条记录吗? 我们每天需要清除大约 10 万到 100 万条记录。 关于你的第二个问题。 MySQL 文档指出:如果要从大表中删除许多行,则可能会超出 InnoDB 表的锁定表大小。他们建议在这种情况下使用临时表。关于堆栈溢出***.com/questions/19448868/… 和 Rashid Kumar 的blog article 有一个类似的问题:删除 MySQL 中的大量记录 【参考方案1】:在 InnoDB 中,任意大小的DELETE
是事务性的。删除一百万会很慢,主要是因为需要为可能的ROLLBACK
做准备。
我在 http://mysql.rjweb.org/doc.php/deletebig 中回答了其余的问题,包括关于如何做的建议。
【讨论】:
根据您文章的块策略,我开发了一个程序并在循环内删除 1000 行,我观察到The total number of locks exceeds the lock table size
。我的innodb_buffer_pool_size=128M
和autocommit=1
。这怎么可能?有什么方法可以在每次查询后释放锁?还是与运行删除的循环有关?
@ismathullah - 哎哟。你有多少内存?你的 MySQL 几岁了? 128M 是旧的默认值。将 1000 减少到 100,直到计算出最佳 buffer_pool_size。
我使用的是 MariaDB-10.0.35,MySQL 5.6。在 8C 16GB 服务器上。减少可能会起作用,但我会删除 50+ 百万条记录。一旦在迭代中完成了一个删除查询,该锁将被正确释放。这是如何运作的?循环中的删除有什么特别之处吗?
@ismathullah - 取决于autocommit
的设置以及您是否使用BEGIN
。
autocommit=1
并且我已经使用BEGIN
来启动过程定义,我相信不会将所有内容都放入事务中。将为每次迭代使用单独的事务块进行测试。如果有帮助,将发布结果。以上是关于Mysql/Mariadb 删除查询是事务性的吗?及其巨大的表现。行数?的主要内容,如果未能解决你的问题,请参考以下文章