我应该将参考数据存储在应用程序内存中还是数据库中?

时间:2010-02-12 22:10:19

标签: performance language-agnostic optimization

我面临着为应用程序存储一些参考数据(基本上是下拉值)的选择。这些数据不会改变(或者如果确实如此,我需要重新启动应用程序),并且经常作为AJAX自动完成小部件的一部分进行访问(因此,一个用户可能会对这些数据进行多次查询字段)。

假设每条记录看起来像这样:

category
effective_date
expiration_date
field_A
field_B
field_C
field_D

自动完成查询将需要针对每个记录中的4个字段检查输入字符串,并针对类别和有效/到期日期检查离散参数,因此如果这是SQL查询,则它将具有类似于以下内容的where子句:

... WHERE category = ? 
AND effective_date < ?
AND expiration_date > ? 
AND (colA LIKE ? OR colB LIKE ? OR colC LIKE ?)

我觉得这可能是一个相当低效的查询,但我想我对数据库如何优化索引等方面知之甚少。我知道很多非常聪明的人真的很难真正使数据库引擎对这种确切的事情很快。

我看到的替代方法是将其存储在我的应用程序内存中。我可以为每个类别提供这些记录的列表,然后迭代该类别中的每个记录以查看是否满足过滤条件。这绝对是O(n),因为我需要检查该类别中的每条记录。

有没有人面临类似的选择?你有什么见解可以提供吗?


编辑:感谢您的见解,伙计们。将整个数据集发送到客户端实际上并不是一种选择,因为数据集非常大(几MB)。

3 个答案:

答案 0 :(得分:1)

如果在应用程序的生命周期内没有发生变化,请将其缓存在内存中。你没错,你不想为每次通话都回到数据库,因为这完全没必要。

关于在服务器上确切缓存多少可能存在争议(我倾向于尽可能少地缓存,直到我真的需要),但是对于不会改变并且将被重复访问的信息,你应该几乎总是缓存在Application对象中。

考虑到您对此数据的指示数量(在6列或更多列上进行过滤),我不确定您能够在内存中优化信息的程度。我要尝试的第一件事是将它存储在Application对象的列表中,并使用LINQ-to-objects查询它。或者,如果有一个字段比其他字段使用得多,或者尝试使用Dictionary而不是列表。如果性能仍然存在问题,请尝试将其存储在DataSet中并在其上设置索引(但当然,这样就会失去一些代码简单性和可维护性)。

答案 1 :(得分:0)

我认为你的问题没有一个适合所有人的答案。根据数据大小和使用模式,答案会有所不同。不仅如此,答案可能会随着时间而改变。

这就是为什么在我的开发中我构建了一些中间层,它允许我通过改变配置来改变缓存的方式(没有代码更改)。我们每次分析各种统计数据(缓存命中率等)并决定是否要更改缓存行为。

BTW还有第三层 - 您可以将静态数据推送到浏览器并将其缓存在那里

答案 2 :(得分:0)

你能不能将它硬连接到程序中(只要你坚持干)?更改它只需要重建。