2

编辑:

我正在寻找是否可以缓存大数据(整个数据库或大量表)的原因是因为数据库列是加密的,即使对于具有不同对称 rijndael 密钥的不同 IV 向量的不同行也是如此。因此 SQL 过滤是没有选择的,或者索引没有意义。此外,应用程序,实际上是云和商业应用程序的框架,被设计为尽可能独立于数据库。您建议仅加密包含真正敏感信息(例如电子邮件地址或 SSN)的表的某些列,但这会使框架不标准,您需要为加密列和未加密列编写新代码应用。如果缓存没有问题,那么我可以基于对象、字典、linq 等进行所有操作。

我计划在内存中缓存所有或大部分数据库表(加密)。

我正在开发一个基于云的应用程序,它将有 100MB SQL Server / MySQL 限制,将由不同的客户端共享。(所以我可以在缓存时按客户端对它们进行分组;甚至根据业务模型创建更小的缓存组)

我不知道;SELECT * FROM获取 100000 行、10 MB 或 20 MB 的数据等需要多少时间。

我进行了快速搜索,但找不到任何基准来说明检索大量行的“大致”持续时间。

我的公司正在使用现代世界中大多数中小型公司常用的商业软件。据说每天都有活跃记录,4.5年只有20MB的MySQL数据。

我检查了 MySQL Administrator,发现最大的表是 inventory_movements,有 7MB 的数据和 45000 行。

我使用 MySQL Query Browser 并执行以从该表中选择所有记录。软件工具指出它花费了0.4971 秒。现在我想我有一个想法。

SELECT * FROM在 C# .NET 中获取所有行(仅纯、无过滤器、连接);来自 SQL Server 数据库的 7MB 数据 - 45000 行会产生相似的持续时间,对吗?我还可以,如果是 2 或 3 秒。

这边走; 至少我有一个想法;如果我缓存 100MB 数据;这可能需要 5 到 30 秒。(数据在获取期间不会被解密)(稍后会在需要时在 RAM 中解密)(我知道我失去了大部分数据库功能。查询将基于缓存中的对象)(我是刚开始在写这篇评论时思考;如果我成功了;我什至可以使用 xml 作为免费的数据库源,因为我正在为这个应用程序设计类似 OR/M 的函数)

我的问题是;

只要我有足够的资源,缓存100MB的数据没有任何问题,对吧?换句话说; 只要我有内存资源就缓存 100 MB,甚至 500 MB,1 GB 并不奇怪?

第二; 你认为我用 SELECT 获取记录的时间计算是乐观的吗?

在应用程序开始时;我可以缓存数据;并管理缓存和数据库中修改/添加/删除的数据,而无需频繁重新加载缓存。

4

3 回答 3

3

我进行了快速搜索,但找不到任何说明检索大量记录的“大致”持续时间的基准。

你永远不会。数据库的响应速度取决于很多变量,以至于无法为某人回答这个问题。服务器的技术规格是什么?你允许服务器有多少个处理器?你是如何索引表格以供阅读的?

如您所见,组织之外的人无法回答。

只要我有足够的资源,缓存100MB的数据没有任何问题,对吧?换句话说; 只要我有内存资源就缓存 100MB,甚至 500MB,1GB 不是很奇怪吗?

简而言之,在我开始之前,您从错误的角度看待缓存。让我们考虑一下处理器上的缓存。它是干什么用的?它是用来确保频繁操作发生得更快对吧?好吧,这就是数据缓存的用途——但这只是硬币的一方面。

让我们谈谈数据缓存存在的第二个原因。假设您有一个每天执行超过 300 万次操作的应用程序。看起来很多,但在财富 500 强公司中是现实的,是吗?好吧,然后使用缓存来确保对经常使用的数据(甚至是事务驱动的数据)的数据访问没有用户可视化的瓶颈。

请看,一般来说,瓶颈不会是数据库引擎、处理器、RAM、缓存,甚至网络。一般来说,瓶颈是I/O。好吧,即使是最大和最强大的运行 16K RPM 的 SAN 驱动器,每天读/写 300 万次以上的数据库也太难了。

所以,我们该怎么做,我们将数据分布在多台机器上(以防万一出现故障进行负载平衡)并将其存储在 RAM 中。为什么?因为它是最快的 I/O,所以很简单。

所以,我说了这么多,这么说,除非您每天执行数百万次操作,否则您可能需要缓存 500MB 或 1GB 的数据。实际上,从您的问题中不清楚您到底要执行什么,因为那里没有“这是我的应用程序所做的”,但您可能根本不需要缓存

记住这一切。数据缓存绝非易事。

于 2012-12-27T04:09:24.640 回答
1

鉴于数据库服务器和 Web 服务器在同一台机器上,您不会受到网络延迟的影响,因此唯一需要考虑的时间是从数据库中获取数据的时间,以及在数据库中构建对象的时间。网络服务器。如果您可以使对象实例化快速(如果它们是数据表的表示,这应该是可能的),那么您的估计并不是非常乐观 - 这确实取决于您需要执行的选择语句的数量。

就我个人而言,我只建议缓存很少更改的数据表,除非缓存到位以避免繁重的查询——我将假设您的设计决策是合理的。

于 2012-12-27T00:29:02.173 回答
0

如果要缓存大量数据,则需要考虑对这些数据进行操作,例如排序或搜索将需要时间。现在,如果您从不执行这些任务,则无需担心。

另一方面,它可能会质疑需要在内存中缓存大量数据,特别是当您说数据库在同一台服务器上时。

当您拥有静态且不会更改的数据时,最好使用缓存。您处理它并在您的情况下包括解密它并存储它,从而避免将来每次都做同样的工作。

于 2012-12-27T03:50:59.277 回答