【问题标题】:mongodb performance for large document大文档的mongodb性能
【发布时间】:2016-12-30 04:04:35
【问题描述】:
我有一个文档,其中包含数组内某些字段中的大数据结构,由于经常点击读取此类数据,它正在减慢我的应用程序。我正在考虑实施一些解决方案,但在继续之前我需要建议,甚至可能是更好的解决方案,以下是我的想法/问题:
- 缓存数据有帮助吗?
- 我应该使用 memcached 还是 redis 作为缓存引擎,为什么?
- 从该文档中读取单个字段而不是每次都读取是否会有所帮助?
- 我应该做点别的吗?!
【问题讨论】:
标签:
mongodb
performance
caching
redis
memcached
【解决方案1】:
缓存会有所帮助,因为它可以避免您的数据库被频繁访问
Memcache 或 redis 由您决定。我更喜欢 redis,但如果你已经有 memcache 也没关系。
如果您有一个服务器集群,请考虑是否需要集中式缓存
缓存一个完整的文档对获取单个字段没有帮助,因为您在不知道它包含什么的情况下缓存了查询的结果。
【解决方案2】:
您的问题需要进一步澄清。例如,您所说的数据有多大,是几兆字节还是几千兆字节。所有这些因素都会改变解决方案。但是,如果我们认为您有几兆字节,并且您希望防止每次最好的解决方案是缓存时调用数据库。如何选择缓存也完全取决于您的情况。如果您的 Web 应用程序在一台服务器上运行,您可以使用内存缓存(如 ASP.Net 缓存),这对于内存缓存来说非常快速且快速。此缓存存储在您的堆中,因此您可以将所有对象放入缓存中而无需序列化。但请考虑每当您的应用程序像大多数部署一样重新启动时。您的堆将被删除,并且堆内的所有缓存都将被清除。
如果您有多个服务器,那么您可以开始考虑内存不足缓存,因为两台服务器不共享堆内存并且使用所有内存缓存是无用的,因为它会复制数据并且无效是噩梦.但是,这是更可靠的缓存,而不是在堆中,并且在持久性方面比内存中缓存更多。但是,当您通过网络连接传输对象时,您想要放入这种缓存中的任何内容都应该是可序列化的。因此,您不能将所有对象都放入缓存中。 Redis 和 memcached 都可以用于此目的。 Redis 比 Memcached 更复杂,功能更多,但对于您的目的而言,memcached 非常好。
无论您选择哪种缓存系统,都要从广阔的角度来看待它。在您的应用程序中设计一个缓存系统,而随着时间的推移,您需要将更多的东西放入缓存中。所以最好从现在开始为那个时候做好一切准备。
在缓存中非常重要的另一件事是,每当您在缓存中设置某些内容时,您必须考虑何时将其无效。
【解决方案3】:
缓存是否有帮助取决于文档的加入。如果文档被多次访问,那么由于 MongoDB 到内存缓存的实际工作方式,缓存将无济于事。
首先,您需要了解您的数据访问模式。