存档记录:分区,附加表或状态标志

时间:2018-08-04 03:31:04

标签: ruby-on-rails database postgresql data-modeling

我正在开发一个需要大量记录的应用程序。例如,如果标记为task n 个小时后,则它变为只读。前端客户端查询“活动”任务或“已归档”任务,但绝不会将两者混合在一起。我想知道存储已存档任务记录的理想方式是什么,随着时间的推移,它们将大大超过“活动”任务。

我主要感兴趣的是防止“活动”任务查询与大量已归档任务联系并降低性能。

标记/索引archived: boolean列是否足够?我还考虑将它们分区/移动到自己的archived_tasks表中以进行完全分离,但是我不确定这是否有必要。还有其他想法吗?

其他信息:还会基于当前用户的外键进行过滤。

1 个答案:

答案 0 :(得分:0)

“索引的基数是其中的唯一值的数量。您的数据库表中可能有十亿行,但是如果在这些行中只有8个唯一值,则您的基数非常低。

低基数指数并不是主要的效率提升。大多数SQL索引都是二进制搜索树(B-Trees)。与对表中的每一行进行串行扫描以查找匹配约束相比,B树在对数上减少了必须进行的比较次数。 当树的大小较小时,对B树执行搜索的收益非常低。

那么将索引放在布尔字段上?还是枚举值字段? 在大量行中包含很少数量不同值的基数不会产生明显的效率提升。将数据库索引保存在基数非常高的字段中,以确保与顺序扫描相比,扫描B树的收益最大。”

-Red Hat首席架构师Joshua Ginsberg。

有关此主题的更多信息,http://www.ovaistariq.net/733/understanding-btree-indexes-and-how-they-impact-performance/#.W2gT1H6YPEY