Mysql/Mariadb delete查询是事务性的吗?它对大量行的性能如何?

Mysql/Mariadb delete查询是事务性的吗?它对大量行的性能如何?,mysql,performance,mariadb,sql-delete,transactional,Mysql,Performance,Mariadb,Sql Delete,Transactional,Q1:在mysql/mariadb中,删除查询是否作为整个事务运行。所以,如果我们有100万行要删除,mysql/mqriadb服务器是否会将其作为一个整体删除,或者如果在删除某些行后出现问题,则删除的行将被恢复 问题2:我们是否需要在单个删除查询中删除行(无论需要删除多少行),还是需要在删除查询中设置限制并成批执行删除。如果需要批处理,我们应该考虑多少行(要删除的行数)。在InnoDB中,任何大小的删除都是事务性的。删除一百万会很慢,主要是因为需要为可能的回滚做好准备 我将介绍中的其余问题,包

Q1:在mysql/mariadb中,删除查询是否作为整个事务运行。所以,如果我们有100万行要删除,mysql/mqriadb服务器是否会将其作为一个整体删除,或者如果在删除某些行后出现问题,则删除的行将被恢复


问题2:我们是否需要在单个删除查询中删除行(无论需要删除多少行),还是需要在删除查询中设置限制并成批执行删除。如果需要批处理,我们应该考虑多少行(要删除的行数)。

在InnoDB中,任何大小的
删除都是事务性的。删除一百万会很慢,主要是因为需要为可能的
回滚做好准备


我将介绍中的其余问题,包括如何做的建议。

您的第一个问题是重复的:对于第二个问题,这实际上取决于您计划删除多少记录。你真的认为你会经常需要删除数百万条记录吗?我们每天需要清理大约10万到100万条记录。关于你的第二个问题。MySQL文档说明:如果要从一个大表中删除多行,可能会超过InnoDB表的锁表大小。他们建议在这种情况下使用临时桌子。关于堆栈溢出和Rashid Kumar提出的一个类似问题:删除MySQL中的大量记录基于您文章的区块策略,我开发了一个过程,在循环中删除1000行,我观察到锁的总数超过了锁表的大小。我的
innodb\u buffer\u pool\u size=128M
autocommit=1
。这怎么可能?是否有任何方法可以在每次查询后释放锁?或者它与运行delete的循环有关吗?@ismathullah-Ouch。你有多少公羊?你的MySQL多大了?128M是一个旧的默认值。在计算出最佳缓冲池大小之前,将1000减少到100。我使用的是MariaDB-10.0.35,MySQL 5.6。在8C16GB服务器上。减少可能有效,但我正在删除5000多万条记录。一旦在迭代中完成了一个dele查询,该锁将立即被释放。这是怎么回事?循环中的删除有什么特别之处吗?@ismathullah-取决于
autocommit
的设置,以及您是否使用
BEGIN
autocommit=1
和我是否使用
BEGIN
启动过程定义,我相信这不会将所有内容都放入事务中。对于每个迭代,将使用单独的事务块进行测试。如果有帮助,将发布结果。