J'ai rencontré un problème MongoDB dans le projet, et je n'ai toujours pas réussi à le résoudre après plusieurs jours. J'espère obtenir des conseils d'experts.
Le problème spécifique est le suivant : lorsque la base de données n'est pas consultée pendant une longue période, la première requête de la base de données prend beaucoup de temps, mais les requêtes suivantes seront très rapides.
Détails :
①整个数据库大小大概在1.9TB左右;
②我查询的collection的数据大致为700万条;
③我查询一次得到的数据为23万条左右;
④服务器内存为120GB;
⑤已按照查询条件建立了索引,索引数据大小为600MB左右;
⑥第一次查询所用时间20s左右,之后的查询在1s以内。
Raisons actuellement envisagées :
由于MongoDB不负责内存的管理,所以,当长时间未访问数据库时,内存中的数据即为冷数据,操作系统的内存管理程序就会将这部分冷数据释放,导致下次查询时,需要重新加载数据到内存,所以比较费时。目前,不能够确定是加载索引比较费时,还是加载数据比较费时。MongoDB虽然提供了touch命令(该命令能够指定将某个collection的索引数据或者用户数据加载到内存中),但是我使用的是WiredTiger存储引擎,该命令不支持该存储引擎。
Aide nécessaire :
①是不是以上原因导致的该问题?
②如果是该原因导致的,如何确定是加载索引费时还是加载数据费时?
③有什么比较好的解决方案么?
注:由于该collection最大会达到25GB左右,而且整个数据库还有其他很多collection,所以将该collection的所有数据存储到内存是不可取的。如果能够确认是加载索引费时的话,倒是可以考虑定期将索引加载到内存,但是对于WiredTiger存储引擎,没有支持该功能的方法,这又是一个问题。
Le problème que vous avez mentionné est lié à l'ensemble de travail.
1. Qu'est-ce que l'ensemble de travail ?
Un concept important dans la gestion de la mémoire de MongoDB. Dans la gestion de la mémoire, essayez de placer en mémoire les ensembles de données fréquemment consultés et les index associés.
2. Comment placer le jeu de travail en mémoire ?
Dans votre déclaration, cela signifie en fait que l'ensemble de travail doit être préchauffé et placé en mémoire à l'avance (Préchargement ou Préchauffage). Comment le faire concrètement ? Vous avez évoqué le tactile (moteur MMAP), alors comment l'implémenter dans les versions ultérieures (moteur WT) ?
S'il s'agit d'une base de données relationnelle, la méthode souvent utilisée est select * Plusieurs fois lors des tests de performances, afin d'obtenir de bons résultats, un lot d'instructions Select sera exécuté à l'avance pour réchauffer la mémoire.
Dans MongoDB, considérez :
1) Si l'index couvert peut être directement utilisé dans des requêtes métier, ou lorsque l'index doit être réchauffé :
db.collection.find({}, {"_id" : 0, "field_a" : 1, "field_b" : 1}).hint({"field_a" : 1, "field_b" : 1}). expliquer()
2) Lorsque vous devez préchauffer l'ensemble de travail, le principe est que vous savez quelles données de votre collection doivent être consultées fréquemment, généralement pendant une certaine période, puis que vous utilisez la même méthode que ci-dessus pour la collection dans ce période de temps pour se réchauffer.
La différence est la suivante : le préchauffage de l'index préchauffe tout l'index, donc la condition de requête est {}, tandis que le préchauffage de l'ensemble de travail ne préchauffe qu'une certaine partie des données de la collection, donc la condition de requête peut être des conditions liées au temps gamme.
Pour référence.
J'adore MongoDB ! Amusez-vous!
Conférence des utilisateurs de la communauté chinoise MongoDB à Shenzhen
Prenons rendez-vous ce samedi
Veuillez entrer pour plus de détails