use*_*169 10 ruby mysql performance ruby-on-rails
我在rails项目中遇到了一些性能问题(在rails 2.0.5上运行),例如在我的用户管理页面中.
我的用户模型有很多关系(细节,地址,角色...),他们加载了急切的加载.这会产生非常大的SQL查询,在某些情况下,加载30个用户需要将近一分钟.另一方面,删除急切加载会产生数百个查询,最后我遇到了同样的问题:加载页面速度很慢.
我曾经在Java和Oracle上进行开发,对于我用于创建视图的这种大查询,这些视图随后被缓存以便更快地呈现.维护非常无聊,因为我必须在视图脚本中手动更新数据库字段等...
但它真的有很棒的表现....所以我想知道是否有人试图在活动记录中实现某些东西以利用Mysql视图?
我刚做了一些基本的测试,这是我的观点(这个例子只有几个字段,我有一个标准的Restful Authentication用户表,以及一个用于个人数据的大表"详细信息"):
CREATE VIEW users_vs AS SELECT
users.id ,
users.login ,
users.email ,
details.last_name ,
details.first_name ,
details.phone ,
details.fax ,
FROM `users` LEFT OUTER JOIN `details` ON details.user_id = users.id ;
Run Code Online (Sandbox Code Playgroud)
然后一个模型:
class UsersV < ActiveRecord::Base
end
Run Code Online (Sandbox Code Playgroud)
在我的控制台中尝试了一些事情:
u=UsersV.find(:first) # ok !
u=UsersV.find_by_last_name('smith') #=> ok !
us=UsersV.find_all_by_last_name('smith') #=> ok too !
Run Code Online (Sandbox Code Playgroud)
查看日志,简单查询的处理方式与任何表查询相同
当然,那些假模型只会用于读取数据.
我在想:
如果有人已经尝试过吗?
如果这是个好主意?
如果我应该调查类似memcached的东西......
视图的"问题"(在这种情况下,您可能想要一个物化视图,假设复杂查询所基于的数据不会经常更改)是您在某种程度上违反了Rails的DRY'(为视图添加了UserV模型,纯粹主义者认为这是用户模型的重复.)
因此,理想的解决方案是为您的复杂查询充分利用RDBMS.如果未缓存的查询仍然需要很长时间才能执行(你仍然必须运行它们来填充memcached),或者如果你不能容纳一点时间 - 软糖(即缓存的结果,那么Memcached将无法帮助你)必须是实时精确的)和/或所涉及的表经常被修改.
| 归档时间: |
|
| 查看次数: |
5732 次 |
| 最近记录: |