Hello everyone! I've a question that I hope someone in here would be able to 
answer. Today I was writing a simple test for a method that takes the last 
"n" (where n is an integer) users that signed up on my web app.

I know it's a simple method, but then I started to think about the optimal 
way to query the DB, and I tried different options. The first thing I did 
was create 1000 users through a simple:

1000.times {Factory(:student)}

The difference between the first and the last records is about 2 minutes.

first created_at: 2010-12-15 20:35:41
last created_at: 2010-12-15 20:37:51

And this is what I've got on the console when using 
ActiveRecord::Base.uncached:

*User.order("created_at DESC").limit(5).reverse*
User Load (*7.4ms*)  SELECT "users".* FROM "users" ORDER BY created_at DESC 
LIMIT 5

*User.order("created_at ASC").last(5)*
User Load (*1179.1ms*)  SELECT "users".* FROM "users" ORDER BY created_at 
ASC

*User.last(5)*  *# I didn't even know I could add a parameter to last*
User Load (*1171.2ms*)  SELECT "users".* FROM "users"

*User.all.last(5)*
User Load (*1177.3ms*)  SELECT "users".* FROM "users"

Well, there's obviously a huge performance impact between querying the DB 
with the first one and the rest. There're some things I would love to 
understand.

- If the users are created in order, this means the last user is the last 
that signed up. This means that the first query would have had to order all 
the 1000 users by date, then take only 5 and then reverse the array right??? 
So, why is it so fast???

- The second query, in this case would not have to order the users, as by 
default they are all ordered right? So, it would only have to take the last 
5 elements of the array. But why is it slower than the first one?

- The third and fourth queries, I guess load all the users in memory and 
then return only the last 5.

Any information about this would be really helpful. Thanks.

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en.

Reply via email to