gpt4 book ai didi

Rails 3 中的 MySql 使用 User.first 速度快,使用 User.first(1) 速度慢 - 为什么?

转载 作者:行者123 更新时间:2023-11-29 01:43:01 28 4
gpt4 key购买 nike

我有一张表,里面有大约 500,000 个用户。当我使用我的 Rails 3.0 控制台并输入

User.first

我立即得到结果。但是当我输入

User.first(1)

需要几秒钟。可能是什么原因造成的?

注意:同样的事情发生在

User.last

User.last(1)

最佳答案

我在 Erb (Rails 3.0.7) 中打开了日志显示并产生以下结果

1.8.7 :004 > User.first
User Load (4.3ms) SELECT `users`.* FROM `users` LIMIT 1
=> #<User id: 1, email: "user@project.ru">
1.8.7 :005 > User.first(1)
User Load (0.4ms) SELECT `users`.* FROM `users`
=> #<User id: 1, email: "user@project.ru">
1.8.7 :008 > User.first(2)
User Load (0.4ms) SELECT `users`.* FROM `users`
=> [#<User id: 1, email: "user@project.ru", #<User id: 2, email: "user@gmail.com">]

所以我们可以看到,当您不带参数调用 first 时,它会按预期工作,但是当我们调用 first 并使用 number 作为参数时它为数据库加载所有用户,然后只在用户数组中保留 number 元素。

recent Rails code first 看起来像这样

def first(*args)
if args.any?
if args.first.kind_of?(Integer) || (loaded? && !args.first.kind_of?(Hash))
limit(*args).to_a
else
apply_finder_options(args.first).first
end
else
find_first
end
end

所以还是可以的。但是在older version like Rails 3.0.7它是:

def first(*args)
if args.any?
if args.first.kind_of?(Integer) || (loaded? && !args.first.kind_of?(Hash))
to_a.first(*args)
else
apply_finder_options(args.first).first
end
else
find_first
end
end

所以你可以看到如果 first 参数是 Integer ActiveRecord 加载所有数据,将其转换为数组并调用 Array 的 first 方法,这具有以下行为:http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-first

关于Rails 3 中的 MySql 使用 User.first 速度快,使用 User.first(1) 速度慢 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14473376/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com