2015-12-31 99 views
3

我有一个包含9百万条记录的表。我定期将这些数据同步到第三方。我保留一个列,告诉特定行是否已经同步。Rails 3 - delete_all不支持限制范围,而MySQL支持它

现在我需要删除几乎6 million同步行,如果运行

Model.where(:sync_flag => true).delete_all 

将是一个不错的想法我不知道。每秒钟有数百个插入,我认为这可能会导致锁定表的方式会伤害/阻塞插入(MySQL专家需要在这里纠正)

通过上面的序言,我想到了使用删除在一个循环的限制条款,删除所有记录,直到没有剩下,但有以下

Model.where(:sync_flag => true).limit(5000).delete_all 

它提出了一个异常delete_all doesn't support limit scope

有没有解决方案来解决这个问题而不离开Rails环境?

回答

2

ActiveRecord::Base.connection.send(:delete_sql,'delete from <table name> where sync_flag = true limit 1000')

你必须使用send因为 'delete_sql' 是受保护的,但这个工程。

另一种解决方案可能是

Model.connection.exec_delete('DELETE FROM <table name> where sync_flag=true LIMIT 10000', 'DELETE', [])

它会返回受影响的行,也将通过轨道记录器记录的查询。

1

如何执行此SQL命令?

Model.connection.exec_delete('DELETE FROM models WHERE sync_flag = 1 LIMIT 5000', 'DELETE', []) 
+0

当我尝试你的解决方案时,MySQL抛出了这个错误'这个版本的MySQL还不支持'LIMIT&IN/ALL/ANY/SOME子查询' –

+0

它是Percona Server 5.6。 25。 –