我的用户模型有很多关系(细节,地址,角色…)谁加载了渴望加载.这创建了非常巨大的SQL查询,在某些情况下,加载30个用户需要几分钟的时间.另一方面,去除渴望加载会产生数百个查询,最终我有同样的问题:加载页面很慢.
我曾经在Java&甲骨文,对于我用来创建视图的这种大查询,这些视图被缓存,以便更快的呈现.维护非常无聊,因为我不得不在视图脚本等中手动更新数据库字段.
但是它真的有非常棒的表演….所以我想知道有没有人试图实现一些事情,以利用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 ;
然后一个模型:
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这样的东西…
解决方法
因此,理想的解决方案是充分利用复杂查询的RDBMS.如果未缓存的查询仍然需要很长时间才能执行,Memcached将无法帮助您(您仍然需要运行它们来填充memcached),或者如果您无法容纳一点点时间(即缓存结果)必须要实时准确)和/或所涉及的表格经常被修改.
>在MysqL中查看是否可以进一步优化查询,这将需要毫秒而不是秒(添加适当的索引,运行ANALYZE等)>如果您有选择使用/尝试另一个RDBMS(如Postgres),一定要试一试.与其他基于成本的引擎(如Oracle和Postgres)相比,MysqL与复杂的连接(InnoDB)相当糟糕.我从MysqL切换到Postgres,并且复杂的连接将需要30秒在MysqL(所有索引到位)需要毫秒在Postgres.如果使用Postgres,可以很好地利用PGAdminIII的图形说明计划工具.