【问题标题】:Deleting from huge database从庞大的数据库中删除
【发布时间】:2013-05-16 08:41:18
【问题描述】:

我正在从大约 1.8GB 大的数据库中删除数据。 (通过 C# 应用程序)

在较小的数据库(~600MB)上运行相同的操作没有问题,但在我得到的大数据库上:

超过锁定等待超时;尝试重启事务。

innodb_lock_wait_timeout 会解决问题还是有其他方法?

我不认为优化查询是一种解决方案,因为没有办法让它们变得更简单。


我正在删除有关条件和关系的部分数据,而不是所有数据。

【问题讨论】:

  • 考虑为您的删除调用添加适当的索引确保您使用的是现有索引。
  • 我也很好奇为什么这被标记为 C#。
  • 你能把删除分批成更小的块吗?
  • 这是我唯一的希望,但我在发帖之前检查了这个。 :( 它是用 C# 标记的,因为删除是在 C# 应用程序中运行的,它必须“清理”数据库,如果 C# 对 mysql 操作有一些内存限制,我很好奇?
  • 您应该修改您的问题以包括 (1) 删除命令、(2) 带有索引的表架构以及 (3) 您打算使用该命令删除多少 1.8GB。跨度>

标签: c# mysql innodb delete-row corresponding-records


【解决方案1】:

您可以将删除语句拆分为不会超时的较小部分。
就像从 id 1 到 1000 删除这些东西,执行并提交,对 ids 10.000 -20.000 等做同样的事情......

【讨论】:

  • 如果表索引不佳,删除单行可能会导致超时。
  • 这可能是一个解决方案,但 C# 会处理它吗?我在某些表中有数百万或半百万条记录。 ://
  • 您是在使用实体、休眠还是直接连接?如果您只是使用普通连接器,那么您必须自己做,因为没有进行优化。
  • 带有 .NET 2.0 的纯 C#(它很旧,但它是必需的)
  • 会不会也是连接器超时?如果您找不到增加超时时间的方法,那么恐怕您别无选择。
【解决方案2】:

您提到您“...根据某些条件和关系删除部分数据,而不是所有数据”。我会检查您用来过滤要删除的数据的所有键上是否有适当的索引。

如果您要向我们展示您的架构和 where 子句,我们可以建议可能有所帮助的内容。

您还应该考虑将您的删除操作拆分为多批数量较少的行。

另一种选择是执行 SELECT INTO,仅将您想要保留的数据放入另一个表中,删除原始数据,然后重命名这个新表。

【讨论】:

    【解决方案3】:

    右键单击表--> 将表编写为--> 创建到--> 新查询.. 保存查询...

    右击表格 --> 删除

    刷新您的数据库和 Intellisense 以忘记该表,然后运行将重新创建该表的脚本,这就是您拥有一个空表的方式...

    或者如果你不想删除表中的所有信息,你可以简单地增加innodb_lock_wait_timeout(或table_lock_wait_timeout,不确定是哪个)的设置

    【讨论】:

    • 谢谢,但这不是我的解决方案。我在不同的服务器上有不同的数据库,为所有人保存准备好的查询是没有意义的。
    • 如果您不想删除表中的所有信息,您可以简单地增加innodb_lock_wait_timeout(或table_lock_wait_timeout,不确定是哪个)的设置
    【解决方案4】:

    如果要删除表中的所有行,请使用

     Truncate table *tablename* 
    

    delete 命令在完成任务时使用事务日志,但 truncate 将其清除而不记录。

    【讨论】:

    • 我是根据某些条件和关系删除部分数据,而不是全部数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2018-04-09
    相关资源
    最近更新 更多