首页 > 解决方案 > 从表中备份/删除的最快方法

问题描述

我正在尝试从具有 > 50M 行的表中备份一些数据。桌子看起来像这样

# 
entry_id             : int unsignedauto_increment   # unique entry id
---
time=CURRENT_TIMESTAMP : timestamp                  # current timestamp
room                 : varchar(255)                 # Room
id                   : varchar(255)                 # Sensor ID / NAME
value                : double                       # sensor value

我的计划是

  1. 获取有限数量的 KEYS(即fetch('KEY', limit=some_large_number)
  2. 检索这些 KEYS 的表条目
  3. 将数据块保存在磁盘上
  4. 删除属于 KEYS 的表条目
  5. 重来 ...

只是获取,比如说 1_000_000 个条目,相当快(几秒钟),但是如果我想通过检索主键 - > 获取数据 - > 删除这些条目 - 我基本上被困在获取数据(> 20 分钟) ~ 100_000 个条目或超时(?))。

使用数据联合逻辑执行此任务的最优雅/最省时的方法是什么?

(数据联合python版'0.13.2'

标签: datajoint

解决方案


如果你的数据没有变化,那么你可以使用limitandoffset关键字来遍历表,在不删除或限制的情况下分块获取。无需先检索主键、限制提取或删除块。

step = 1_000_000
for chunk in range((len(table) + step - 1) // step):
    block = table.fetch(limit=step, offset=step * chunk)
    ... # save block

如果这是一个简单的备份,则不需要删除。如果您需要删除数据,您可以在最后一次将其全部删除。


推荐阅读