Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.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中进行批量/更快的删除?_Mysql - Fatal编程技术网

有没有办法在mysql中进行批量/更快的删除?

有没有办法在mysql中进行批量/更快的删除?,mysql,Mysql,我有一个有1000万条记录的表,在过去30天里,删除和保留记录的最快方式是什么 我知道这可以在事件调度器中完成,但我担心的是,如果占用太多时间,它可能会锁定表很长时间 如果你能建议一些最佳的方法,那就太好了 谢谢。关闭您的资源, 选择。。进入OUTFILE、解析输出、删除表、加载数据本地填充优化的\u db.txt——重新创建比更新更便宜 我会立即: 重命名该表 创建一个空表,其名称与 原始表格 从“临时”表中提取最后30天并插入 把它们放回新桌子上 放下临时表 这将使您能够(几乎)在整个过程中

我有一个有1000万条记录的表,在过去30天里,删除和保留记录的最快方式是什么

我知道这可以在事件调度器中完成,但我担心的是,如果占用太多时间,它可能会锁定表很长时间

如果你能建议一些最佳的方法,那就太好了

谢谢。

关闭您的资源,
选择。。进入OUTFILE
、解析输出、删除表、
加载数据本地填充优化的\u db.txt
——重新创建比更新更便宜

我会立即:

  • 重命名该表
  • 创建一个空表,其名称与 原始表格
  • 从“临时”表中提取最后30天并插入 把它们放回新桌子上
  • 放下临时表

  • 这将使您能够(几乎)在整个过程中保留表格,并在空闲时获取过去30天的数据。

    这并不是说它可以帮助您解决当前的问题,但如果这是经常发生的情况,您可能需要研究a:只需在不同的时间段添加表格,当不再需要时,将它们从
    合并
    表定义中删除。另一种选择是,删除(最旧的)分区同样简单。

    您可以尝试分区表

    PARTITION BY LIST (TO_DAYS( date_field ))
    
    这将为您每天提供1个分区,当您需要修剪数据时,您只需:

    ALTER TABLE tbl_name DROP PARTITION p#
    

    进一步阐述迈克尔·托德的答案

    如果你有空间

  • 创建一个与要缩小的表相似的空白临时表
  • 在暂存表中仅填写您希望在目标表中保留的记录
  • 按如下方式进行双重重命名
  • 假设: table是要从中清除大量数据的表的表名 newtable是临时表的名称 没有其他表被称为诱惑

        rename table table to temptable, newtable to table;
        drop temptable;
    
    这将在单个事务中完成,这将需要一个即时模式锁。大多数高并发性应用程序不会注意到这一变化


    或者,如果您没有空间,并且有一个长窗口来清除此数据,则可以使用动态sql将主键插入临时表,并在delete语句中连接临时表。插入临时表时,请注意最大数据包大小。大多数MySQL安装使用16MB(16777216字节)。临时表的insert命令应小于max_packet_size。这不会锁住桌子。您需要运行优化表以回收空间供引擎的其余部分使用。除非关闭引擎并移动数据文件,否则您可能无法回收磁盘空间。

    @Sharpeye500-一旦将表的数据量减少到仅30天,将剩下多少条记录?1000万?您是否有自动提交、设置事务等功能?根据数据的可用性,另一个选项是1。将过去30天的时间放在新的表2中。切换两个表(使新表成为主表)3。移动在切换期间添加到旧表中的任何内容(可能很少)。@Brendan这肯定是一个更具容错性的解决方案。不,这必须是自动化的。我无法重命名该表,因为它由应用程序访问。谢谢,在删除记录之前,我会使用select into&load data进行数据备份。它需要删除700-800万条记录,而为了存档需要备份1000万条记录。