mongodb利用索引查询时候,是在数据创建时,就把该条数据索引放入内存,还是查询时候才把该条索引加载到内存,在内存中的索引是不是常驻不会自动清除?
如何去预估数据索引占用内存大小,比如一条数据大小1kb,那么该条数据创建索引会占用内存多大空间?
mongodb利用索引查询时候,是在数据创建时,就把该条数据索引放入内存,还是查询时候才把该条索引加载到内存,在内存中的索引是不是常驻不会自动清除?
如何去预估数据索引占用内存大小,比如一条数据大小1kb,那么该条数据创建索引会占用内存多大空间?
1 回答1.3k 阅读✓ 已解决
2 回答1.4k 阅读
1 回答1.3k 阅读
1 回答649 阅读
写入数据和修改索引是在一个事务中完成。没错,虽然MongoDB从4.0才开始对外支持事务,不过WiredTiger引擎从一开始就是支持内部事务的。既然写入数据时要同时更改索引,首先你必须要找到更改哪一部分索引。所以更新时也是需要查询索引的。既然要查询,索引必须到内存中来。
所有WiredTiger缓存都是按照最近最少使用(LRU)的原则来清除的,无论是不是索引。使用得频繁就有更大的机会驻留内存。
最后一个问题,没有这么简单的计算方法。索引本质上是键值对。值占用的空间都一样,但键的大小不一样。而且索引键还会压缩,很难估计最后的实际大小。最简单的办法,根据你的要求自己模拟一批数据,然后查看
db.<集合>.stats()
,里面会有索引大小。然后根据你的数据数量和索引大小大概估算下达到实际数据量时索引有多大。这个大小也大致是需要占用的内存大小。