我有一个数据库,有几百万个实体需要一个friendly_id slug。有没有办法加快保存实体的过程? find_each(&:save)
非常慢。每秒6-10点,我正在观看超过一周的全天候运行。
我只是想知道在friendly_id或并行处理技巧中是否有一种方法可以大大加快这个过程。
目前我正在运行大约10个控制台,并在每个控制台内启动值+ 100k:
Model.where(slug: nil).find_each(start: value) do |e|
puts e.id
e.save
end
修改
导致更新变得非常缓慢的最大问题之一是实体的初始查找查询,而不是实际保存记录。我把网站放在前一天,看着服务器数据库请求不断达到2000毫秒,罪魁祸首是@entity = Entity.find(params[:id])
导致500多条记录的大多数问题。我没有意识到slug列上没有索引,而活动记录正在slug列上执行SELECT
语句。正确索引后,我得到20毫秒的响应时间,运行上面的查询从每秒1-2个实体到每秒1k。做多个这样的工作可以让这项工作快速完成一次性操作。
答案 0 :(得分:2)
我认为最快的方法是直接进入数据库,而不是使用Active Record。如果您有像Sequel Pro这样的GUI,请连接到您的数据库(详细信息在您的database.yml中)并在那里执行查询。如果您对命令行感到满意,可以直接在数据库控制台窗口中运行它。 Ruby和Active Record会让你慢下来这样做。
要更新名为“users”的假设表的所有slug,其中slug将是他们的名字和姓氏的串联,你可以在MySQL中做这样的事情:
UPDATE users SET slug = CONCAT(first_name, "-", last_name) WHERE slug IS NULL