在以下方面需要您的帮助:
我有一个 MongoDB 集合,其中包含超过 2600 万个文档。 文档的结构是不变的(pastebin.com/iBzW0Fkz)
该集合包括“用户”字段的索引
db.conversations.getIndexes();
结果 - pastebin.com/xHecpw00
对字段“用户”的所有请求都执行得很慢(超过 100 毫秒)
db.getCollection('conversations').find({users: {$all: ["5942328", "9082468"]}});
解释 - pastebin.com/0C11Cr9F
db.getCollection('conversations').find({users: "9163099"});
解释 - pastebin.com/CmvuDf10
问题列表:
- 为什么索引请求执行如此缓慢?
- mongodb服务器或进程重启后如何预热索引? Touch() 指令在 WiredTiger 引擎中不再可用。
这是一个附加信息
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 可以解决这个问题,但没有机会测试它。
提前致谢。
最佳答案
- 我认为问题在于您拥有大量数据。
- 您的索引位于数组字段上,这效率不高,因为 MongoDB 索引数组的每个值时您的索引变得非常大,因此您可以查询单个项目。
您可能希望研究分片以将数据拆分到多个实例,但请注意,您不能选择 users
field as shard key
关于MongoDB。为什么索引请求执行如此缓慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40766841/