在Ruby on Rails应用程序中使用MySQL视图来提高性能

前端之家收集整理的这篇文章主要介绍了在Ruby on Rails应用程序中使用MySQL视图来提高性能前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在rails项目(在rails 2.0.5上运行)中有一些性能问题,例如在我的用户管理页面中.

我的用户模型有很多关系(细节,地址,角色…)谁加载了渴望加载.这创建了非常巨大的SQL查询,在某些情况下,加载30个用户需要几分钟的时间.另一方面,去除渴望加载会产生数百个查询,最终我有同样的问题:加载页面很慢.

我曾经在Java&甲骨文,对于我用来创建视图的这种大查询,这些视图被缓存,以便更快的呈现.维护非常无聊,因为我不得不在视图脚本等中手动更新数据库字段.

但是它真的有非常棒的表演….所以我想知道有没有人试图实现一些事情,以利用MysqL视图的主动记录?

我只是做了一些基本测试,这里是我的观点(仅仅是几个例子,我有一个标准的Res​​tful 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 ;

然后一个模型:

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这样的东西…

解决方法

意见的“问题”(在这种情况下,您可能想要一个物化视图,假设复杂查询所基于的数据不会频繁更改)是您在某种程度上违反了Rails的DRY’ness纯粹主义者认为的视图的UserV模型的添加用户模型的重复.)

因此,理想的解决方案是充分利用复杂查询的RDBMS.如果未缓存的查询仍然需要很长时间才能执行,Memcached将无法帮助您(您仍然需要运行它们来填充memcached),或者如果您无法容纳一点点时间(即缓存结果)必须要实时准确)和/或所涉及的表格经常被修改.

>在MysqL中查看是否可以进一步优化查询,这将需要毫秒而不是秒(添加适当的索引,运行ANALYZE等)>如果您有选择使用/尝试另一个RDBMS(如Postgres),一定要试一试.与其他基于成本的引擎(如Oracle和Postgres)相比,MysqL与复杂的连接(InnoDB)相当糟糕.我从MysqL切换到Postgres,并且复杂的连接将需要30秒在MysqL(所有索引到位)需要毫秒在Postgres.如果使用Postgres,可以很好地利用PGAdminIII的图形说明计划工具.

猜你在找的Ruby相关文章