MongoDB的.为什么索引的请求执行得如此之慢?

Mak*_*tik 6 mongodb

在以下方面需要您的帮助:

我有一个MongoDB集合,其中包含超过2600万个文档.文档的结构是不变的(pastebin.com/iBzW0Fkz)

该集合包括"用户"字段的索引

db.conversations.getIndexes();
Run Code Online (Sandbox Code Playgroud)

结果 - pastebin.com/xHecpw00

对字段"用户"的所有请求都执行得非常慢(超过100毫秒)

db.getCollection('conversations').find({users: {$all: ["5942328", "9082468"]}});
Run Code Online (Sandbox Code Playgroud)

说明 - pastebin.com/0C11Cr9F

db.getCollection('conversations').find({users: "9163099"});
Run Code Online (Sandbox Code Playgroud)

说明 - pastebin.com/CmvuDf10

问题清单:

  1. 为什么索引的请求执行得如此之慢?
  2. 如何在重启mongodb服务器或进程后预热索引?WiredTiger引擎中不再提供Touch()指令.

这是一个额外的信息

db.stats();
Run Code Online (Sandbox Code Playgroud)

结果 - pastebin.com/9JZF8ChQ

db.getCollection('conversations').stats(); 
Run Code Online (Sandbox Code Playgroud)

结果 - pastebin.com/17yV4Fsi

db.conversations.getIndexes();
Run Code Online (Sandbox Code Playgroud)

结果 - pastebin.com/xHecpw00

有关服务器的信息:

lscpu - pastebin.com/k7wUE4gH

lshw -short - pastebin.com/w5XYuY3U

假设HDD的读取操作是瓶颈,SSD可能会解决此问题,但没有机会对其进行测试.

提前致谢.

mar*_*kin 0

  1. 我认为问题在于你有很多数据。
  2. 您的索引位于数组字段上,这效率不高,因为当 MongoDB 为数组的每个值建立索引时,您的索引会变得非常大,因此您可以查询单个项目。

您可能需要研究分片以将数据拆分到多个实例中,但请注意,您不能选择users字段作为分片键