Mysql 如何快速检查数据库中是否存在大量记录?
在Rails应用程序中的某个时刻,我从缓存中检索了大量ActiveRecord对象。但是,由于这些记录存储在缓存中,因此可能其中一些记录已从数据库本身删除,因此我循环这些记录并检查每个记录是否存在。这需要很多时间。有没有更有效的方法来实现这一点?这也可能被认为是数据库设计问题,而不是真正的rails问题。从这个角度来看,是否可以向表中添加具有唯一索引的自动递增字段 即使在执行记录存在性检查时,活动记录查询接口最终也必须依赖数据库进行查找。因此,无论界面有多好,如果数据库需要做大量工作,都需要时间,而不是rails的“错误”。让数据库尽可能快地验证您想要的记录 如果您熟悉oracle,这与在查询中存储oracle rowid以便以后能够验证现有记录的想法相同 正如Danny所指出的,也许缓存大量记录并在以后大量使用它们对你的应用程序来说是个坏主意。你能阅读并立即处理你的记录吗Mysql 如何快速检查数据库中是否存在大量记录?,mysql,ruby-on-rails,database,activerecord,Mysql,Ruby On Rails,Database,Activerecord,在Rails应用程序中的某个时刻,我从缓存中检索了大量ActiveRecord对象。但是,由于这些记录存储在缓存中,因此可能其中一些记录已从数据库本身删除,因此我循环这些记录并检查每个记录是否存在。这需要很多时间。有没有更有效的方法来实现这一点?这也可能被认为是数据库设计问题,而不是真正的rails问题。从这个角度来看,是否可以向表中添加具有唯一索引的自动递增字段 即使在执行记录存在性检查时,活动记录查询接口最终也必须依赖数据库进行查找。因此,无论界面有多好,如果数据库需要做大量工作,都需要时间
这些建议都不是一个快速解决方案。如果您要检查的记录数量确实很大,那么您可以通过批量传输一个一个地分摊发送这些记录的成本:创建一个临时表,在其中插入从缓存中取出的行,然后将临时表与原始表合并。然后,您的DBMS将为您执行循环。如果缓存的结果包括您感兴趣的记录的主键,您可以非常轻松地筛选结果,只需从数据库中选择这些键并查看返回的内容。然后把过时的唱片踢出去,你就可以走了
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
当记录从数据库中删除时,您为什么不从缓存中删除它们
如果要将这些记录存储在缓存中,并且需要它们与数据库同步,那么从数据库中删除它们时,请确保也从缓存中删除它们的存在,因此,省去了以后必须检查冗余数据的昂贵查询。这只是@Danny的一个问题-你的评论有什么帮助?我不明白为什么有人会简单地说这真的很难,并且认为它在任何方面都是有帮助的。你是说忘记它,重新设计你的代码?@jimmcnamara-谢谢你的反馈!你说得对,我的评论不是特别清楚。我想补充的是认识到这是编码中最难做到的事情之一,希望有点幽默。从数据库中删除记录时(使用ActiveRecord回调),不能从缓存中删除相关对象吗?这样你就不必循环检查它是否存在。我想你应该重新考虑一下你的数据库结构,如果这是不可能的,那么考虑一下“sphinx”或者更好的“thinking sphnix”,它提供了比活动记录快得多的缓存!