在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 ! 查看日志,简单查询的处理方式与所有表查询相同 当然,这些假模型只是用来读取数据. 我在想: >如果有人已经尝试过了? 解决方法
意见的“问题”(在这种情况下,您可能想要一个物化视图,假设复杂查询所基于的数据不会频繁更改)是您在某种程度上违反了Rails的DRY’ness纯粹主义者认为的视图的UserV模型的添加是用户模型的重复.)
因此,理想的解决方案是充分利用复杂查询的RDBMS.如果未缓存的查询仍然需要很长时间才能执行,Memcached将无法帮助您(您仍然需要运行它们来填充memcached),或者如果您无法容纳一点点时间(即缓存结果)必须要实时准确)和/或所涉及的表格经常被修改. >在MySQL中查看是否可以进一步优化查询,这将需要毫秒而不是秒(添加适当的索引,运行ANALYZE等)>如果您有选择使用/尝试另一个RDBMS(如Postgres),一定要试一试.与其他基于成本的引擎(如Oracle和Postgres)相比,MySQL与复杂的连接(InnoDB)相当糟糕.我从MySQL切换到Postgres,并且复杂的连接将需要30秒在MySQL(所有索引到位)需要毫秒在Postgres.如果使用Postgres,可以很好地利用PGAdminIII的图形说明计划工具. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |