gpt4 book ai didi

mysql - 在内存中排序的数据库查询是否比在 Rails 3.2 应用程序的查询中包含该顺序需要更少的服务器资源?

转载 作者:行者123 更新时间:2023-11-29 12:56:45 24 4
gpt4 key购买 nike

我们有一个 Rails 3.2 应用程序,它有相当多的数据库表,并且我们经常访问数据库。我正在考虑重构应用程序,将所有查询放置在应用程序 Controller 的一个区域中。例如:

# DATABASE QUERIES
def get_users_in_a_group
@users_in_a_group = User.where("group_id = ?", current_group.id)
end

同一个查询也有多种排序方式。例如,@users_in_a_group 根据需要按用户名、出生日期或上次登录顺序排序。我正在考虑将一个区域放入应用程序中,紧随数据库查询区域,例如

# ORDERED DATABASE QUERIES
def get_users_in_a_group_ordered_by_username
get_users_in_a_group
@users_in_a_group_ordered_by_username = @users_in_a_group.order("username")
end

def get_users_in_a_group_ordered_by_last_login
get_users_in_a_group
@users_in_a_group_ordered_by_last_login = @users_in_a_group.order("last_login")
end

据我所知,数据库查询越少越简单越好。我认为上面的场景的工作方式是数据库被命中一次,然后排序在内存中完成。与按特定顺序查询数据库相比,这对服务器资源来说是好是坏,例如:

@users_in_a_group_ordered_by_last_login = User.where("group_id = ?", current_group.id).order("last_login")

感谢您的帮助。

最佳答案

一般的经验法则是让 SQL 做它能做的一切,以及它不能做的一切,然后才让 Ruby/Rails 接管。

还要添加的一个小注意事项是,还可以利用向数据库添加索引(通常称为大量表)的优势。

如果您想比较 sql 负载,请启动 .irbc 文件并添加以下内容:

if ENV.include?('RAILS_ENV') && !Object.const_defined?('RAILS_DEFAULT_LOGGER')
require 'logger'
RAILS_DEFAULT_LOGGER = Logger.new(STDOUT)
end

最后,为了回答您的问题,似乎如果您正在调用同一个组但想要两种不同的方式对它们进行排序,那么您可以将集合保存为实例变量,然后根据所选的情况延迟加载排序需要。

除非您想将方法更改为:

def get_users_in_a_group
@users_in_a_group ||= User.where("group_id = ?", current_group.id)
end

如果它已经被调用,那么我们只需提取已有的内容并重新排序即可。

关于mysql - 在内存中排序的数据库查询是否比在 Rails 3.2 应用程序的查询中包含该顺序需要更少的服务器资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23940635/

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