我有一个名为Stream的类,它的数据库中有许多记录,而且还在不断地向其中添加更多的记录。streams表中名为rating的字段可以是-1、0、1或为null。我会说“rating”为rating -1、0或1,而"unrated“为空。到目前为止,streams表中有24M条记录。有20M是有等级的,4M是未有等级的。需要经常在streams表中查询未评级的记录。问题是,查询这么大的表需要时间。
我想把streams表分解成3个单独的表。可以有一个分级流表、一个未分级流表和一个旧的未分级流表。它的工作方式是,创建一个新的流。新记录未分级,因此将其放入未分级流表中。如果已评等,则会将其移动到“评等流”表中。如果超过一周未评级,它将被移动到旧的未评级流表中。我仍然需要能够无缝地使用Stream类中的方法和关联,例如:
buzz.rated_streams.first
interest.unrated_streams.first
user.old_streams.first
RatedStream.find(1).buzz
UnratedStream.find(2).interest
OldStream.find(3).user可以更快地查询未评级的streams表。rated表对于分析很有用。旧的未分级的streams表将是旧数据的转储。
我有几个问题要问。打破桌子是个好主意吗?如果是这样,我该如何做才能避免破坏一切,并使用Stream类中相同的方法和关联呢?如果打破桌子是一个坏主意,我应该怎么做呢?
发布于 2012-01-05 14:33:47
我觉得这是个不错的主意。大量的自定义代码(不能保证能正常工作)。
相反,您应该在rating上创建索引。这可能会解决查询的所有问题(您可能还希望将其设为covered )。
发布于 2012-01-05 16:28:39
一个好的设计取决于为什么你需要频繁查询一个有400万个匹配项的布尔属性。您是否在维护要评级的流的待办事项列表?您是否正在显示“未分级流的数量”计数器?您是否也在通过其他属性进行查询?
假设是第一个,你可以这样做
streams表中有关流的大部分信息。streams_ratings表,该表通过belongs_to :streams streams_tasks表,该表具有belongs_to :streams的优先级、分配的评核人、分配的日期等。通过对需要使用StreamTask.first(:assignee => 'unassigned').stream进行评级的流进行索引。您可以使用命名作用域创建此smoother.StreamTask并删除该StreamRating
发布于 2012-01-05 15:25:42
不确定您使用的是哪个DB,但您可以对表进行分区以提高性能。
https://stackoverflow.com/questions/8738541
复制相似问题