nic*_*ick 3 mongodb mongoid mongodb-query mongodb-atlas
我无法理解与从 Mongo 数据库集合中的磁盘读取数据相关的瓶颈所在。我知道索引是优化查询的重要因素,但假设我们有一个没有索引的集合,并且我正在一个包含 2500 万条记录、大小约为 50Gb 的集合中运行一个简单的查询:
db.customers.find({ first_name: "xyz" })
Run Code Online (Sandbox Code Playgroud)
当然,这必须运行 a COLLSCAN,所以它非常慢(除非它缓存在内存中)。但在我们的例子中,有多慢是很重要的。运行一些测试表明,我运行此查询的计算机并未与我的可用 IOPS 挂钩。在最大读取 IOPS 约为10K 的计算机上,这个简单的查询被限制在1.2K左右。注意CPUiowait

查询显然受到磁盘的限制,但它没有充分利用机器上可用的潜力。有趣的是,当我创建另一个数据库连接并异步运行两个查询时,IOPS 负载增加了 2 倍。似乎每个查询一次只能扫描磁盘上的这么多数据。运行这些没有索引的查询时,是什么阻碍了它?
从长远来看,我认为在尝试对大量不同数据进行复杂搜索时,将 Elasticsearch 引擎耦合起来会有所帮助,但我真的很好奇为什么在这种情况下我们不能垂直扩展。
mongod节点使用类似于btree的结构来存储数据。叶页可以包含许多最大 32Kb(压缩)的文档,或者单个文档(如果该大小或更大)。
收集扫描在存储引擎层之上的数据库层中运行。当数据库层检查完当前文档后,会从存储中请求下一个文档。
如果文档已经在缓存中,存储层将返回该文档。如果没有,它将向操作系统请求下一页。操作系统可以从文件系统缓存中传递该数据或从磁盘中读取它。然后存储引擎将其解压缩,将文档存储在缓存中,并将所请求的文档提供给数据库层。
处理文档以查看它们是否与查询匹配的线程与存储引擎线程轮流进行。当您同时运行 2 个查询时,会有第二个线程处理第二个查询,因此它们可以将请求交错到磁盘,从而导致更高的 IO 使用率。
| 归档时间: |
|
| 查看次数: |
2974 次 |
| 最近记录: |