更新索引字段对wiredTiger 有任何影响吗?我正在经历以下问题。问:添加索引 { a : 1 } 可能会降低以下哪个操作的速度?检查所有适用。
A. db.collection.update( { b : 456 }, { $inc : { a : 1 } } );
我相信上述答案对于 MMAPV1 是正确的,但在 WiredTiger 中不应该有任何影响,因为 WiredTiger 使用不可变的文档标识符而不是存储位置地址。有人可以证实我的理解。
更新索引字段对wiredTiger 有任何影响吗?我正在经历以下问题。问:添加索引 { a : 1 } 可能会降低以下哪个操作的速度?检查所有适用。
A. db.collection.update( { b : 456 }, { $inc : { a : 1 } } );
我相信上述答案对于 MMAPV1 是正确的,但在 WiredTiger 中不应该有任何影响,因为 WiredTiger 使用不可变的文档标识符而不是存储位置地址。有人可以证实我的理解。
我会说答案是“是”。
该文件明确指出:
添加索引对写操作有一些负面的性能影响。
由于 WiredTiger 不支持就地更新,执行此命令将有效地复制过滤条件 ( { b : 456 }
) 找到的现有文档,但给定的更改 ( { $inc : { a : 1 } }
) 也会反映在新文档中。第二步,为原始文档分配的存储空间将被释放。
使用 MMAPv1,更新文档的空间需求不会与原始文档不同,因此会发生就地更新。
但是,无论使用哪种存储引擎,对索引字段的更改也需要更新受影响的索引。对于 MMAPv1,“仅”索引叶的键在您的情况下发生变化 - 文档保持在同一位置。对于 WiredTiger,键和文档位置都需要在索引中更新。