2009-02-09 55 views
10

我在rails项目(运行在rails 2.0.5上)中出现了一些性能问题,例如在我的用户管理页面中。在Ruby on Rails应用程序中使用MySQL视图以提高性能

我的用户模型有很多关系(详细信息,地址,角色......),他们会加载一个热切的加载。这会创建真正巨大的SQL查询,在某些情况下,加载30个用户需要几分钟的时间。另一方面,删除急切的加载会产生数百个查询,最后我遇到同样的问题:加载页面很慢。

我曾经在Java上开发Oracle &对于这种用于创建视图的大型查询,然后对这些视图进行缓存以获得更快的渲染。这是非常无聊的维护,因为我不得不手动更新视图脚本等数据库字段...

但它真的有奇妙的表演....所以我想知道如果有人曾试图实施的东西在活动记录中使用Mysql视图的好处?

我只是做了一些基本的测试,这是我的看法(只是几个字段的例子,我有一个标准的宁静认证用户表,并为个人DATAS一个大表“详细信息”):

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 ; 

然后一个模型:

class UsersV < ActiveRecord::Base 
end 

尝试了一些东西,我的控制台:

u=UsersV.find(:first) # ok ! 
u=UsersV.find_by_last_name('smith') #=> ok ! 
us=UsersV.find_all_by_last_name('smith') #=> ok too ! 

在查看日志时,简单查询的处理方式与任何表查询相同

当然,这些假模型只会用于读取数据。

我想知道:

  • ,如果有人已经尝试过了吗?

  • 如果这是一个好主意?

  • 我是否应该考虑像memcached的,而不是...

+0

一分钟加载30个用户似乎很慢。您的关联中使用的所有列是否已编入索引?通常检索多少个表和行?如果你使用easger加载更少的话,会发生什么? (MySQL并不总是有效地优化多表连接) – 2009-02-09 22:50:22

回答

5

带有视图的“问题”(在这种情况下,您可能需要物化视图,假设复杂查询基于的数据不会经常更改)是您违反了Rails的DRY'ness,在某种程度上(为视图增加UserV模型,纯粹主义者认为这是对用户模型的重复)。

所以理想的解决方案是从复杂查询中获得最大的RDBMS 。如果未缓存的查询仍然需要很长时间才能执行(您仍然需要运行它们来填充memcached),或者如果您无法容纳一点时间 - fudge(即,缓存的结果不存在),Memcached将无法为您提供帮助。 t必须是实时准确的)和/或涉及的表经常被修改。

  • 在MySQL看看是否可以进一步优化查询,以便如果你有使用/试用的选择,将采取毫秒,而不是秒(加入适当的指标,运行ANALYZE等)
  • 另一种RDBMS如Postgres,无论如何都试一试。 与其他基于成本的引擎(如Oracle和Postgres)相比,MySQL的复杂连接(InnoDB)的性能很差。我从MySQL切换到Postgres,并且复杂的连接将在MySQL上运行30s +(使用所有索引)需要毫秒级的Postgres。如果使用Postgres,可以很好地使用PGAdminIII的图形解释计划工具。
3

我用定期在Rails的表视图,我很开心。只要你用它们来读取记录(这是我通常的场景),Rails将它们视为普通表。只要你的视图只包含一个表格,你甚至可以用它来完成所有其他的CRUD。所以,我的答案是:就这样做。

+0

不,我在同步数据库状态时遇到问题,在服务器上创建视图,而不是迁移,因为rails将视图视为表,我的视图以表而不是意见 – pahnin 2014-01-15 09:22:48

1

http://github.com/aeden/rails_sql_views/tree/master

↑若要在迁移图。我也只会在极端情况下使用它们,因为它们会将逻辑从应用程序中隐藏起来,而且通常不好。

如果你有很多关联的数据,你可以看看使用DataMapper而不是ActiveRecord与Rails,因为它支持根据需要延迟加载数据。

1

确保启用了缓存结果集的MySQL Query Caching。我有几种情况,即使你正在更多地访问服务器,许多没有连接的查询和几个连接查询实际上都比较快。