繁体   English   中英

有关Ruby on Rails,常量,belongs_to和数据库优化/性能的问题

[英]Question about Ruby on Rails, Constants, belongs_to & Database Optimization/Performance

我已经为使用MySQL后端的Ruby on Rails中的一个客户开发了基于Web的销售点系统。 这些家伙的成长如此之快,以至于整个公司每天要处理近10,000笔交易。 对于这个问题,我将使用事务表作为示例。 当前,我将transactions.status作为字符串(即:“ pending”,“ completed”,“ incomplete”)存储在具有索引的varchar(255)字段中。 一开始,当我尝试按不同状态查找记录时很好,因为我不必担心那么多记录。 随着时间的流逝,使用查询分析器后,我注意到性能有所下降,而varchar字段在数千次查找中实际上会降低查询速度。 我一直在考虑使用Transaction模型中的STATUS CONSTANT将这些varchar字段转换为基于整数的状态字段,如下所示:

class Transaction < ActiveRecord::Base
  STATUS = { :incomplete => 0, :pending => 1, :completed => 2 }

  def expensive_query_by_status(status)
    self.find(:all,
              :select => "id, cashier, total, status",
              :condition => { :status => STATUS[status.to_sym] })
end

这是我最好的选择吗? 你们有什么建议? 我已经在各种查找字段上使用了适当的索引,并在可能的情况下将memcached用于查询缓存。 目前,它们是在3台服务器的分布式服务器环境中设置的,其中第一台用于应用程序,第二台用于数据库,第三台用于缓存(全部位于1个数据中心中,且位于同一VLAN上)。

您是否在代表性数据库上尝试过替代方法? 从给出的示例中,我有点怀疑这会带来很大的不同。 如果只有三个状态,那么按状态查询可能会更好,根本不使用索引。

假设“已完成”占表的80%-不涉及其他索引列,那么如果使用索引,您将需要更多读取。 因此,随着表的增长,这种类型的查询几乎肯定会变慢。 但是,“不完整”和“待定”查询仍可能会受益于索引。 只有这些状态的行总数增加时,它们才会受到影响。

在没有更多选择标准的情况下,您多久查看一次所有内容(包括完整的内容)? 您能以某种方式(内部或外部)对表进行分区吗? 例如,将完成的事务存储在单独的表中,当新事务到达其最终(?)状态时,将新事务移到该表中。 我认为内部数据库分区是MySQL 5.1中引入的-查看文档 ,看来RANGE分区可能是合适的。

综上所述,我确实认为摆脱将状态存储为字符串可能会有一些好处。 除了存储和带宽方面的考虑之外,您很可能会无意间错误地拼写了一个整数,或者更好地是一个常数或符号。

您可能想开始限制搜索(如果您还没有这样做的话), #find(:all)在这个范围上#find(:all) 另外,您可能想考虑事务模型在转换为视图时所要达到的目标,并可能渴望加载这些模型以最小化对db的额外信息请求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM