【问题标题】:Fastest way to backup / delete from table从表中备份/删除的最快方法
【发布时间】:2021-05-30 12:59:41
【问题描述】:

我正在尝试从超过 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 个条目,相当快(几秒钟),但是如果我想通过检索主键 -> 获取数据 -> 删除这些条目 - 我基本上被困在获取数据(>大约 100_000 个条目需要 20 分钟或超时(?))。

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

(Datajoint python版'0.13.2')

【问题讨论】:

    标签: datajoint


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,Dimitri,我不知道offset 参数。我终于能够归档所有数据,但是 delete()delete_quick() 都(!)在此表上失败,并重复出现 Lock Wait Timeout 错误(所有插入/获取命令都已停止)。这可能特定于我们的设置,我想知道是否有一个简单的解决方案(该表没有下游表)。在这些情况下 drop() 更好吗?
    • 如果在同一个表或下游表中的相同范围的数据上存在正在进行的事务,则删除将超时。您可以在单独的 Python 会话中使用 dj.kill() 来查看正在进行的事务,以了解可能导致超时的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2020-07-09
    • 1970-01-01
    • 2010-10-27
    • 2019-06-27
    • 1970-01-01
    • 2015-11-01
    相关资源
    最近更新 更多