使用缓存与DB索引过滤记录?

时间:2017-03-26 11:58:48

标签: java performance caching indexing rdbms

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

  1. 一种方法是对缓存数据应用过滤。好东西在这里我可以保存昂贵的IO调用坏的事情是我需要在应用程序中进行过滤(java)
  2. 第二种方法是使用DB索引从DB获取数据。好的是我可以使用DB索引来消除所有记录的扫描。坏事是我需要做的 IO来电。
  3. 哪种方法表现更好?

1 个答案:

答案 0 :(得分:0)

  

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

您无法确定您的缓存是否包含所有数据,并且它是一致的。使缓存与数据库保持同步,可能会对事务进行处理,从而引发许多其他问题。

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

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

  

第二种方法是使用DB索引从DB获取数据。好的是我可以使用DB索引来消除所有记录的扫描。糟糕的是我需要进行IO调用。

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

  

哪种方法表现更好?

另请注意,您的个人表演也是程序员。从长远来看,制定复杂的解决方案不会让你感到快乐和好看。

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