C# 从大型数据库中删除
我正在从大约1.8GB的数据库中删除数据。通过C应用程序 同样的操作在较小的数据库(约600MB)上运行没有问题,但在较大的数据库上我得到: 超过锁定等待超时;尝试重新启动事务 innodb_lock_wait_timeout会解决问题吗?还是有其他方法 我不认为优化查询是一个解决方案,因为没有办法使它们更简单C# 从大型数据库中删除,c#,mysql,innodb,delete-row,corresponding-records,C#,Mysql,Innodb,Delete Row,Corresponding Records,我正在从大约1.8GB的数据库中删除数据。通过C应用程序 同样的操作在较小的数据库(约600MB)上运行没有问题,但在较大的数据库上我得到: 超过锁定等待超时;尝试重新启动事务 innodb_lock_wait_timeout会解决问题吗?还是有其他方法 我不认为优化查询是一个解决方案,因为没有办法使它们更简单 我正在删除关于条件和关系的部分数据,而不是全部数据。右键单击表->将表作为脚本->创建到->新建查询。。保存查询 右键单击表格->删除 刷新数据库和Intellisense以忘记该表,然
我正在删除关于条件和关系的部分数据,而不是全部数据。右键单击表->将表作为脚本->创建到->新建查询。。保存查询 右键单击表格->删除 刷新数据库和Intellisense以忘记该表,然后运行脚本重新创建该表,这就是为什么会有一个空表
或者您可以简单地增加innodb_lock_wait_timeout或table_lock_wait_timeout的设置,但不确定如果不想删除表中的所有信息,可以将delete语句拆分为不会超时的较小部分。
如从id 1到1000删除这些内容,执行并提交,对id 10.000-20.000等执行相同操作。如果要删除表中的所有行,请使用
Truncate table *tablename*
delete命令在完成任务时使用事务日志,但truncate在不记录日志的情况下清除事务日志 您提到您正在“…根据某些条件和关系删除部分数据,而不是所有数据”。我将检查您用于筛选要删除的数据的所有键上是否有适当的索引 如果您向我们展示您的模式和where子句,我们可以建议一些可能有用的
你也应该考虑把你的删除分成多个较小的行数。
另一种替代方法是执行SELECT INTO,只将要保留在另一个表中的数据放入另一个表中,删除原始数据,然后重命名此新表 考虑为您的删除调用添加适当的索引,或者确保您正在使用现有的索引。我也很好奇为什么会将其标记为C。您能将删除批处理成更小的块吗?这是我唯一的希望,但我在这里发布之前检查了这一点:它是用C标记的,因为delete是在一个C应用程序中运行的,该应用程序必须清理数据库,我很好奇C是否对mysql操作有一些内存限制?你应该修改你的问题,包括1个delete命令,2个带索引的表模式,3个你打算用该命令删除的1.8GB中有多少。谢谢,但这不是我的解决方案。我在不同的服务器上有不同的数据库,为所有服务器保存就绪查询是毫无意义的。或者您可以简单地增加innodb_lock_wait_timeout或table_lock_wait_timeout的设置,但不确定如果您不想删除table中的所有信息,如果表的索引不良,删除一行可能会导致超时。这可能是一个解决方案,但C会处理吗?我在一些表格中有百万或五十万条记录/您是使用实体、nhibernate还是直接连接?如果你只是使用普通连接器,那么你必须自己做,因为没有进行优化。纯C和.NET 2.0它很旧,但它是必需的。它也可能是连接器超时吗?如果您无法找到增加超时的方法,那么恐怕您没有其他选择。我将根据某些条件和关系删除部分数据,而不是所有数据。