必须在建索引时通过storageengine.wiredtiger.configstring指定block_compressor=zstd及leaf_page_max=internal_page_max=16k,因wiredtiger不支持对已有索引在线修改压缩配置;重建需先dropindex再createindex,或后台创建后手动替换,验证需检查stats().indexdetails中compressor为zstd且页大小为16384。

MongoDB中索引体积过大导致磁盘空间快速耗尽,尤其在文本字段创建全文索引后,原始索引可能膨胀至数GB;不压缩时,【leaf_page_max和internal_page_max默认64k会显著削弱zstd压缩效果】,必须显式调小页尺寸才能触发高压缩率。
为新索引启用zstd压缩并优化页大小
执行createIndex命令,指定storageEngine.wiredTiger.configString参数,强制使用zstd压缩及16k页限制:
db.mycollection.createIndex( {"content":"text"}, { "name":"content_text_zstd", "storageEngine": { "wiredTiger": { "configString":"block_compressor=zstd,leaf_page_max=16k,internal_page_max=16k" } } } )
这一步必须在建索引时一次性完成,WiredTiger不支持对已有索引在线修改压缩配置。
替换已有非压缩索引为zstd压缩索引
方法一:直接重建(适用于可接受短时锁表的场景)
① 查看当前索引名:db.mycollection.getIndexes()
② 删除旧索引:db.mycollection.dropIndex("old_text_index_name")
③ 执行带zstd和16k页的新建索引命令(同上一节)
注意:dropIndex操作不可逆,删除前请确认索引无业务强依赖或已做好回滚预案。
方法二:后台重建(仅限WiredTiger 3.2.1+,且需确认mongod版本)
db.mycollection.createIndex( {"content":"text"}, { "name":"content_text_zstd_bg", "background": true, "storageEngine": { "wiredTiger": { "configString":"block_compressor=zstd,leaf_page_max=16k,internal_page_max=16k" } } } )
后台创建期间原索引仍可用,但新建索引完成前需手动删除旧索引,否则两者共存将加倍占用磁盘。
验证压缩是否生效
运行db.mycollection.stats(),检查返回结果中的indexDetails字段:
若看到"compressor" : "zstd"且"leaf_page_max" : 16384,说明配置已生效。
对比dataSize与storageSize差值:压缩后storageSize应明显小于未压缩索引的对应值,通常可降低30%~60%磁盘占用。











