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

时间:2016-11-23 14:15:36

标签: mongodb

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

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

该集合包含“用户”字段

的索引
db.conversations.getIndexes();

结果 - pastebin.com/xHecpw00

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

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

EXPLAIN - pastebin.com/0C11Cr9F

db.getCollection('conversations').find({users: "9163099"});

EXPLAIN - pastebin.com/CmvuDf10

问题列表:

  1. 为什么索引的请求执行得这么慢?
  2. 如何在重启mongodb服务器或进程后预热索引? WiredTiger引擎中不再提供Touch()指令。
  3. 这是一个额外的信息

    db.stats();
    

    结果 - pastebin.com/9JZF8ChQ

    db.getCollection('conversations').stats(); 
    

    结果 - pastebin.com/17yV4Fsi

    db.conversations.getIndexes();
    

    结果 - pastebin.com/xHecpw00

    有关服务器的信息:

    lscpu - pastebin.com/k7wUE4gH

    lshw -short - pastebin.com/w5XYuY3U

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

    提前致谢。

1 个答案:

答案 0 :(得分:0)

  1. 我认为问题在于你有很多数据。
  2. 你的索引在数组字段上,这是无效的,因为你的索引变得非常大,因为MongoDB索引数组的每个值,所以你可以查询单个项目。
  3. 您可能需要查看分片以在多个实例之间分割数据,但请注意,您无法选择users field as shard key