如何快速检查数据库中是否存在大量记录?

时间:2012-11-29 02:36:38

标签: mysql ruby-on-rails database activerecord

在我的Rails应用程序中的某个时刻,我从缓存中检索大量的ActiveRecord对象。但是,有些记录可能已从数据库中删除,因为它们存储在缓存中,所以我循环记录并检查每个记录是否存在。这需要相当多的时间。有没有更有效的方法来做到这一点?

4 个答案:

答案 0 :(得分:2)

当从数据库中删除记录时,是否有理由不删除缓存中的记录?

如果您要将这些记录存储在缓存中并需要它们与db同步,那么当您从db中删除它们时,请确保从缓存中删除它们的存在,因此节省了昂贵的查询以后必须检查冗余数据。

答案 1 :(得分:1)

这也可以被认为是数据库设计问题,而不是真正的rails问题。从这个角度来看,您可以为表添加一个带有唯一索引的AUTO INCREMENT字段吗?

即使在进行记录存在检查时,活动记录查询接口也必须最终依赖数据库进行查找。因此,无论接口有多好,如果db必须做大量工作,这需要时间,而不是轨道“故障”。尽可能快地让db验证您想要的记录。

如果您熟悉oracle,这与在查询中存储oracle rowid以便稍后验证现有记录的想法相同。

正如Danny似乎指出的那样,也许缓存大量的记录并在以后使用它们对你的应用来说是个坏主意。你能阅读,然后立即处理你的记录吗?

这些建议都不是快速解决方法。

答案 2 :(得分:0)

如果您检查的记录数量确实很大,那么您可以通过批量转移来逐个分摊运输成本:创建临时表,对其进行大量插入从缓存中提取的行,然后将临时表连接到原始表。然后,您的DBMS将为您执行循环。

答案 3 :(得分:0)

如果缓存中的结果包含您感兴趣的记录的主键,则可以通过从数据库中选择那些键并查看返回的内容来轻松过滤结果。然后开始陈旧的记录,你很高兴。

results_from_cache = $redis.get("users")

cached_user_ids = results_from_cache.map(&:id)
actual_user_ids = User.where(id: user_ids).pluck(:id)

results_minus_stale = results_from_cache.select do |user|
  actual_user_ids.include?(user.id)
end