删除记录时,许多has_one关联的模型非常慢

时间:2014-10-19 02:45:12

标签: ruby-on-rails activerecord

我有一个Notification模型。只要CommentLikeMentionFollow等某些操作发生,此表就会添加一条记录。这个表现在有数百万条记录。我拥有的唯一索引是user_id - 这对我向current_user显示通知非常重要。

在每个相关模型中,我都包含以下行

  has_one :notification, dependent: :destroy

问题是所有这些行为都是可逆的,所以每当有人说不喜欢时,我都需要销毁相关的通知。

因为这样的通知#destroy动作现在非常慢,经常采取> 10secs!我确定这是因为每次发生破坏时,都必须查找外键,例如like_idcomment_idmention_id

我可以在所有这些记录上添加索引,但是我担心这个表有多大以及它有多少次获得INSERTS和DELETES。我应该担心吗?有没有更好的方法来构建它?

1 个答案:

答案 0 :(得分:0)

一种可能性是考虑翻转周围的关系,使用belongs_to而不是has_one,所以你只依赖于该表上的主键。

否则,你应该有那些指数;它不应该是一个太大的负担。如果你不这样做,你会受到严厉的打击。它甚至可能将数据库锁定在那些删除上。

使用SHOW TABLE STATUS查看索引大小,以了解您可能正在查看的内容。