【问题标题】:Filter records using cache vs DB index?使用缓存与数据库索引过滤记录?
【发布时间】:2017-08-19 02:22:20
【问题描述】:

有些 RDBMS 表有数百万条记录,有些则有几千条记录。我已经在 ehcache 中缓存了这些记录。假设我已经缓存了数百万客户 来自数据库表的ehcache。现在必须在运行时确定的多个属性上搜索/过滤客户

  1. 一种方法是对缓存数据应用过滤。好事是我可以节省昂贵的 IO 调用 坏事是我需要在应用程序(java)中进行过滤
  2. 第二种方法是使用数据库索引从数据库中获取数据。好消息是我可以使用数据库索引,这将消除对所有记录的扫描。坏事是我需要做 IO 调用。

哪种方法在性能方面更好?

【问题讨论】:

    标签: java performance caching indexing rdbms


    【解决方案1】:

    一种方法是对缓存数据应用过滤。好事是我可以节省昂贵的 IO 调用 坏事是我需要在应用程序(java)中进行过滤

    您无法确定您的缓存是否包含所有数据,并且是一致的。使您的缓存与数据库同步,可能会遵守事务,这会导致您遇到许多其他问题。

    如果我们谈论的是在内存中完成的只读、分析和数据拟合,您可以将所有内容加载到适当的数据结构(HashMap、Tree 等)中。那么你就不需要缓存了。

    对缓存数据进行过滤,通常意味着对数据进行顺序扫描。这可能不是很快。一些缓存提供索引,但随后您被锁定在非常特定于供应商的扩展中。

    第二种方法是使用数据库索引从数据库中获取数据。好消息是我可以使用数据库索引,这将消除对所有记录的扫描。不好的是我需要进行 IO 调用。

    如果您的所有数据都不在缓存中,则无论如何您都需要进行数据库请求,并且数据库也需要进行索引访问。数据库查询可以只返回 ID,因此您可以节省行数据的冗余传输。一致性可能是这里的一个问题。

    哪种方法在性能方面更好?

    另外请记住,还有你作为程序员的个人表现。从长远来看,制定复杂的解决方案不会让你快乐和好看。

    您需要做什么取决于数据库 I/O 的成本和您的问题域。

    【讨论】:

    • 好吧,当你说If we are talking about a read-only, analytical and data fits complete in memory, you can load everything into the appropriate data structures (HashMap, Tree, etc.). Then you don't need a cache查找时间会很快,但每次用户需要数据时,他都需要进行数据库调用。为了避免我们需要缓存
    • 如前所述,所有内容都将被预加载到 HashMap 中。 HashMap 比任何缓存都更简单、更快。
    猜你喜欢
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 2018-02-18
    相关资源
    最近更新 更多