好的,所以我知道在处理非常大的数据时,我们可以使用find_in_batches哪个,据我所知,它Model.all.each以非常快的方式完成工作,效率更高
现在,我有一个非常大的数据,我正在尝试删除,我正在考虑使用它find_in_batches来批量删除它们.
以下是我所拥有的(来自rake任务database.rake):
old_messages = TextMessage.where("created_at < ?", number.days.ago )
old_messages.find_in_batches do |batch|
batch.delete_all
end
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,我收到以下错误:
ArgumentError: wrong number of arguments (0 for 1..3)
/Users/Sunday/.rvm/gems/ruby-2.2.0/gems/httparty-0.13.5/lib/httparty.rb:66:in `logger'
/Users/Sunday/.rvm/gems/ruby-2.2.0/gems/activerecord-4.2.2/lib/active_record/relation/delegation.rb:94:in `public_send'
/Users/Sunday/.rvm/gems/ruby-2.2.0/gems/activerecord-4.2.2/lib/active_record/relation/delegation.rb:94:in `block in method_missing'
/Users/Sunday/.rvm/gems/ruby-2.2.0/gems/activerecord-4.2.2/lib/active_record/relation.rb:302:in `scoping'
/Users/Sunday/.rvm/gems/ruby-2.2.0/gems/activerecord-4.2.2/lib/active_record/relation/delegation.rb:94:in `method_missing'
/Users/Sunday/.rvm/gems/ruby-2.2.0/gems/activerecord-4.2.2/lib/active_record/relation/batches.rb:112:in `find_in_batches'
/Users/Sunday/workspace/resilience/lib/tasks/database.rake:18:in `block (2 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)
database.rake第18行的地方是:old_messages.find_in_batches do |batch|.
那么,是否有可能find_in_batches像我想要的那样用于删除?如果答案是肯定的,那么我做错了什么.感谢所有回复.
我有下表
CREATE TABLE "METRIC_VALUE_RAW"
(
"SUBELEMENT_ID" INTEGER NOT NULL ,
"METRIC_METADATA_ID" INTEGER NOT NULL ,
"METRIC_VALUE_INT" INTEGER,
"METRIC_VALUE_FLOAT" FLOAT(126),
"TIME_STAMP" TIMESTAMP NOT NULL
) ;
Run Code Online (Sandbox Code Playgroud)
您能否分享一下我如何设计分区的想法?
掉落ORDER BY+ LIMIT,或在JOIN,一切都是桃子.把它们放在一起,我似乎释放了海妖.任何可以解雇的人?
DELETE table1 AS t1
FROM table1 AS t1 LEFT JOIN table2 AS t2 ON t1.id = t2.id
WHERE t2.field = 'something'
ORDER BY t1.id DESC
LIMIT 5
Run Code Online (Sandbox Code Playgroud)
(使用别名删除)
我也尝试过没有别名并放弃WHERE,但无济于事.始终是语法错误" near 'ORDER BY...".
我想从MySql DB中的大表(~500K记录)中删除大量记录(~200K).
我希望尽可能高效地进行此调用,因为我不希望DB在执行调用时变得"无响应".
我需要删除"超过10天"的记录(根据created_at列),目前我使用:
delete from table_name where created_at < DATE_SUB(CURDATE(),INTERVAL 10 DAY)
Run Code Online (Sandbox Code Playgroud)
id如果有帮助,该表还有一个主键.
有什么想法吗?
我的数据库空间不足,因此我对旧记录进行了备份。现在,我必须清除这些记录,并且我的参考列是“日期”。
我尝试使用标准方法:
DELETE FROM table WHERE date >= '2017-01-01' AND date <= '2017-12-31'
Run Code Online (Sandbox Code Playgroud)
但这显然要花费太多时间,因为要删除的行超过700万行。有没有办法加快速度?我试图划分成几个月甚至更小的块,但是在运行代码一段时间后,我与服务器断开了连接。
提前致谢。
编辑:
CREATE TABLE table (
id INT(11) NOT NULL AUTO_INCREMENT,
date DATE DEFAULT NULL,
# 18 more columns
PRIMARY KEY (id)
)
ENGINE = INNODB,
AUTO_INCREMENT = 29616055,
AVG_ROW_LENGTH = 317,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_general_ci;
Run Code Online (Sandbox Code Playgroud)