首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于Rails、常量、belongs_to和数据库优化/性能的问题

关于Rails、常量、belongs_to和数据库优化/性能的问题
EN

Stack Overflow用户
提问于 2009-12-13 07:17:05
回答 2查看 637关注 0票数 1

我在Rails中为我的一个客户开发了一个基于MySQL后端的基于web的销售点系统。这些人增长如此之快,以至于他们每天在公司范围内进行近10,000笔交易。对于这个问题,我将使用事务表作为示例。目前,我将transactions.status存储为具有索引的varchar(255)字段中的字符串(即:“未决”、“完成”、“不完全”)。一开始,当我试图通过不同的状态查找记录时,感觉很好,因为我不需要担心太多的记录。随着时间的推移,通过使用查询分析器,我注意到性能已经恶化,varchar字段确实会使查询速度比数千次查询慢。我一直在考虑使用状态常量将这些varchar字段转换为基于整数的状态字段,在事务模型中如下所示:

代码语言:javascript
复制
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台用于应用程序,第2台用于DB &第3台用于缓存(所有这些服务器都位于一个数据中心和同一个VLAN上)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-13 10:31:41

你在代表性数据库上尝试过这一选择吗?从给出的例子来看,我有点怀疑它是否会产生很大的影响,你看。如果只有三种状态,那么状态查询可能会更好--根本不使用索引。

假设“已完成”包含了表的80% --没有其他索引列涉及,如果使用索引,则需要更多的读取。因此,随着表的增长,这种类型的查询几乎肯定会变慢。但是,“不完整”和“挂起”查询可能仍然会从索引中受益;只有当具有这些状态的行总数增加时,它们才会受到影响。

你多久看一次所有的东西,不管是完整的还是其他的,而没有一些更有选择性的标准?您能以某种方式(内部还是外部)对表进行分区吗?例如,将已完成的事务存储在单独的表中,将新的事务移动到它们的最终(?)状态。我认为内部数据库分区是在MySQL 5.1中引入的--从文档的角度来看,范围分区似乎是合适的。

尽管如此,我确实认为将状态存储为字符串可能有一些好处。撇开存储和带宽方面的考虑,你不太可能在不经意间拼写一个整数,或者,更好的是,一个常量或符号。

票数 1
EN

Stack Overflow用户

发布于 2009-12-13 08:18:32

您可能希望开始限制搜索(如果您还没有这样做的话),#find(:all)在这个范围内是相当费钱的。此外,当事务模型被转换到视图中时,您可能会想一想您的事务模型要达到什么目的,并且可能急于加载这些视图,以便将请求最小化到db以获取额外信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1895828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档