快速业务通道

真实世界中的Rails,第3部分: 优化ActiveRecord - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
nd end

ActiveRecord 会负责 id 上的索引,我显式地添加了可在各种搜索中使用的索引,原因是 此表很大、不经常更新却经常被搜索。通常,我们会等到对给定的查询中的问题有一定的把握后才会采取 相应动作。这种策略可以让我们不必二次猜测数据库引擎。但从用户这方面来看,我们知道该表将会很快 具有数百万的用户,如果在经常搜索的列上没有索引,该表的效率会很低。

另外两个常见问题也 与迁移有关。如果字符串和列都不应该为空,那么就请确保正确编写了迁移。大多数 DBA(数据库管理员 )都会认为 Rails 为空列提供了错误的默认属性:默认情况下列可以为空。如果希望创建一个不能为空 的列,您必须显式地添加参数 :null => false。如果具有字符串列,请务必确保编写应用程序的限值 。默认地,Rails 迁移会将 string 列按 varchar(255) 编码。通常,这个值过于庞大。应该尽量保持能 如实反应应用程序的数据库结构。与提供无任何限制的 login 相反,如果应用程序限制 login 只能为 10 个字符,那么就应该相应地编写数据库,如清单 2 所示:

清单 2. 用限值和非空列编写迁移

t.column :login, :string, :limit => 10, :null 

=> false

此外,还应该考虑默认值以及其他任何能安全提供的信息。通过一点预备工作,就 可以节省日后跟踪数据完整性问题的大量时间。在考虑数据库基础的同时,还应该注意哪些页是静态且容 易缓存的。在优化查询和缓存页面这两个选项当中,如果您能 “消受” 复杂性,缓存页面将 会带来更大的回报。有时,页面或片段都是纯静态的,比如一列状态或一组经常问到的问题。在这种情况 下,缓存更胜一筹。而在其他的一些时候,您可能会决定牺牲数据库性能,以减少复杂性。对于 ChangingThePresent,根据问题和环境的具体情况,我们二者都尝试了。如果您也决定要牺牲查询性能, 就请继续阅读吧。

真实世界中的Rails,第3部分: 优化ActiveRecord(3)

时间:2011-11-20

N+1 问题

默认情况下,ActiveRecord 关系十分懒散。这意味着框架会 一直等待访问关系直到您实际访问了该关系。比方说,每个成员都会有一个地址。可以打开一个控制台并 输入如下命令:member = Member.find 1。可以看到追加到日志的如下内容,如清单 3 所示:

清 单 3. 从 Member.find(1) 登录

^[[4;35;1mMember Columns (0.006198)^[[0m  ^[[0mSHOW 

FIELDS FROM members^[[0m
^[[4;36;1mMember Load (0.002835)^[[0m  ^[[0;1mSELECT * FROM members WHERE
(members.`id` = 1) ^[[0m

Member 具有到此地址的关系,并由宏 has_one :address, :as => :addressable, :dependent => :destroy 定义。注意当 ActiveRecord 加载了 Member 时,您 并不会看到地址字段。但如果在控制台中键入 member.address,就可以在 development.log 中看到清单 4 中的内容:

清单 4. 访问关系会强制数据库访问

 ^

[[36;2m./vendor/plugins/paginating_find/lib/paginating_find.rb:98:in `find''^[[0m
^[[4;35;1mAddress Load (0.252084)^[[0m  ^[[0mSELECT * FROM addresses WHERE
(addresses.addressable_id = 1 AND addresses.addressable_type = ''Member'') LIMIT 1^

[[0m
 ^[[35;2m./vendor/plugins/paginating_find/lib/paginating_find.rb:98:in `find''^

[[0m

所以 ActiveRecord 并不会为地址关系执行查询,直到您实际访问 member.address。通常 ,这种懒散设计会工作得很好,因为持久性框架无需移动如此多的数据来加载成员。但如果您想要访问很 多成员以及所有成员的地址,如清单 5 所示:

清单 5. 用地址检索多个成员

Member.find([1,2,3]).each {|member| puts member.address.city}

真实世界中的Rai

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号