Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从大型MySQL innoDB表中删除记录_Mysql_Mariadb - Fatal编程技术网

从大型MySQL innoDB表中删除记录

从大型MySQL innoDB表中删除记录,mysql,mariadb,Mysql,Mariadb,我知道这个问题已经被问过一百次了,但不幸的是,这些答案都没有帮助,因为大多数都已经很多年了,它应该证明另一个答案是正确的 我有两个表,记录为+140kk行/+24GB,额外记录为+89kk行/+70GB 每个额外的行都有一个与记录的外键关系,索引在两个表之间正确设置。从记录中删除将删除级联到相关的额外行 我需要在生产过程中清除旧记录。 运行从记录中删除,其中创建位置

我知道这个问题已经被问过一百次了,但不幸的是,这些答案都没有帮助,因为大多数都已经很多年了,它应该证明另一个答案是正确的

我有两个表,记录为+140kk行/+24GB,额外记录为+89kk行/+70GB

每个额外的行都有一个与记录的外键关系,索引在两个表之间正确设置。从记录中删除将删除级联到相关的额外行

我需要在生产过程中清除旧记录。 运行从记录中删除,其中创建位置 由于SELECT的速度太快,我在selectid子查询^中用一个id尝试了它,不幸的是,这并没有改变任何事情,所以我在15分钟后就把它杀死了

由于删除单个记录的速度很快,因此我最终解决了以下问题:

对于'seq 1 100000'中的i;做 mysql数据库-e从创建的记录中选择id1print DELETE FROM records,其中id=,$1,;}'| mysql数据库; 现在=$date+%Y/%m/%d%T 回声[$now]$i.000 完成 开始时,它可以每秒处理1000条记录,但经过几次循环后,它会下降到每10-20秒处理1000条记录。由于我需要清除10万行,这将需要将近一个月的时间才能完成,这与要清除的记录的时间大致相同,因此它永远不会完成,特别是因为有多个数据库需要这样做

数据库存储在一个SSD上,即CT500MX200SSD1,软件为带InnoDB引擎的MariaDB 10.1。innodb_flush_log_at_trx_commit设置为0以避免不必要的磁盘使用

据了解,瓶颈是磁盘,CPU几乎处于休眠状态,大部分内存都在系统缓存中

结构转储:

请参阅

它讨论了从大型表中高效删除大量行的各种方法

最有效的方法可能是根据表中的主键遍历表,删除该块中符合条件的行

这种方法之所以有效,是因为它一次可以查看(比如)100行数据,并对它们进行处理,然后再移动到下一个100行。相反,使用LIMIT和unbounded WHERE子句可能需要反复扫描相同的行

你提到加入。根据成本的不同,100可能是一个很好的限制。如果联接不太繁重,那么1000个可能会很好


如果这是一个重复性的任务,请考虑使用分区,这样Delp分区就可以用来“立即”执行契约。

在第一个查询中,ID是否需要那个顺序?不用它就尝试它。这是避免复制问题所必需的。只要是ASC default order,就没有什么区别。在WHERE子句中进行范围检查后,AFAIK order BY id不能使用索引。您是否尝试过在没有ORDER BY和LIMIT的情况下执行此操作?select将在毫秒内返回,因此LIMIT和ORDER BY不是问题。由于这是一个生产数据库,我们无法在一天内锁定该表,因此需要对其进行分块操作。为了使查询具有确定性,需要使用ORDER BY,否则会破坏复制。ID的顺序是否与创建的顺序相同?这是什么类型的语法?我无法让它在过程中工作;它需要转换为您正在使用的任何语言。我倾向于避免使用存储过程,因为我发现它们比PHP或Perl更笨拙。你是用什么语言写的?这个数据库的应用程序是用java编写的。但我更喜欢nodejs/php甚至bash/perl脚本。有什么建议吗?在Perl中,我总是使用DBIx::DWIW。但是使用你觉得舒服的东西。